home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2109 / 2109.xpi / chrome / febe.jar / content / febe.js < prev    next >
Text File  |  2009-11-02  |  103KB  |  2,976 lines

  1. // author: Chuck Baker
  2. // contact: febe@customsoftwareconsult.com
  3. // Version 6.3
  4.  
  5.     window.addEventListener("load",febeLoad,true);
  6.     window.addEventListener("close",febeClose,true);
  7.     window.addEventListener("DOMContentLoaded",febeCheckForMissedScheduledBackupLoad,true);
  8.     //window.addEventListener("load",febeStatusbarVisibility,true);
  9.  
  10. function febeLoad(){
  11.     febeSetMsgs();
  12.     
  13.   // Pointer to main browser window
  14.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);  
  15.     febeMainWindow = wm.getMostRecentWindow("navigator:browser"); 
  16.  
  17.   // See if this is a new update/install
  18.     var version = getFebeVersion();
  19.     var newFEBEinstall = Boolean(false);
  20.     var prefName = "extensions.febe.previousversion";
  21.     if(febePrefs.prefHasUserValue(prefName)){
  22.         var pversion = febePrefs.getCharPref(prefName);
  23.         if (pversion != version){newFEBEinstall = true;}
  24.     }else{
  25.         newFEBEinstall = true;
  26.     }//if
  27.     febePrefs.setCharPref(prefName,version);
  28.  
  29.     if(newFEBEinstall == true){
  30.         // Get a list on installed locales
  31.         var locales = febeLocales();
  32.         var locale = febePrefs.getCharPref("general.useragent.locale");    
  33.         if(locale.length == 2){        // If the locale is only two characters, just guess what it's supposed to be
  34.             switch(locale){
  35.                 case "en":
  36.                     locale = "en-US";
  37.                     break;
  38.                 case "fr":
  39.                     locale = "fr-FR";
  40.                     break;
  41.                 case "es":
  42.                     locale = "es-ES";
  43.                     break;
  44.                 case "pl":
  45.                     locale = "pl-PL";
  46.                     break;
  47.                 case "nl":
  48.                     locale = "nl-NL";
  49.                     break;
  50.                 case "zh":
  51.                     locale = "zh-CN";
  52.                     break;
  53.                 case "de":
  54.                     locale = "de-DE";
  55.                     break;
  56.                 case "ja":
  57.                     locale = "ja-JP";
  58.                     break;
  59.                 case "it":
  60.                     locale = "it-IT";
  61.                     break;
  62.                 case "pt":
  63.                     locale = "pt-BR";
  64.                     break;
  65.                 case "sv":
  66.                     locale = "sv-SE";
  67.                     break;
  68.                 case "sk":
  69.                     locale = "sk-SK";
  70.                     break;
  71.                 case "ru":
  72.                     locale = "ru-RU";
  73.                     break;
  74.  
  75.                 default:
  76.                     locale = "en-US";
  77.                     break;
  78.             }//switch
  79.         }//if        
  80.         if(locales.indexOf(locale) == -1){locale = "en-US";}
  81.         febeWelcomePage = "http://customsoftwareconsult.com/extensions/febe/locale/"+locale+"/FEBEwelcome["+locale+"].html";
  82.         setTimeout("febeWelcomePageDisplay()",1500);    // Let the browser catch up
  83.     }//if
  84.     
  85.     setTimeout('febeCheckBackupOnStartup()',5000);
  86.     if(!febeScheduledBuTimer){
  87.         febeScheduledBuTimer = Cc['@mozilla.org/timer;1'].createInstance(Ci.nsITimer);
  88.     }//if
  89.     
  90.     febeScheduleBackup();
  91.     febePrefs.setBoolPref("extensions.febe.backupInProgress",false);
  92.     febeObserverService = new febeObserver();
  93.     febeSetStatusbarVisibility2();
  94.     window.removeEventListener("load",febeLoad,true);
  95.     return true;
  96. }//febeLoad()
  97.  
  98. function febeCheckBackupOnStartup(){
  99.     var windowtype = document.documentElement.getAttribute('windowtype');
  100.     if(windowtype != "navigator:browser"){return false;}
  101.     var ok = false;
  102.     if(febePrefs.getBoolPref("extensions.febe.backupOnStartup")){ok = true;}
  103.     if(febePrefs.getBoolPref("extensions.febe.backupOnStartup.prompt") && ok){
  104.         var tmp = "<style>color: purple; font-weight: bold; font-size: 15px;</style>"+febeMsg[281]+"\n";
  105.         tmp += "<style>color: black;</style>"+febeMsg[283]+"\n";
  106.         ok = febeConfirm(tmp);
  107.     }//if
  108.     if(ok){
  109.         febeInit();
  110.     }else{
  111.         febeRemind();
  112.     }//if
  113.     return true;
  114. }//febeCheckBackupOnStartup()
  115.  
  116. function febeCheckForMissedScheduledBackupLoad(){
  117.     var prefName = "extensions.febe.disableMissedScheduledBackup";
  118.     if(febePrefs.getBoolPref(prefName)){return false}    // Not checking for missed backups
  119.     setTimeout('febeCheckForMissedScheduledBackup()',10000);
  120.     return true;
  121. }//febeCheckForMissedScheduledBackupLoad
  122.  
  123. function febeClose(){
  124.   // Re-assign the schedule controller to another window
  125.     if(!febeIsScheduleController) {return true;}    // This is not the controller, so just return
  126.     
  127.     // This is the controlling window
  128.     // See how many open windows we have ... If there is only one (this one) then no need to re-assign
  129.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  130.     var wincnt = 0;
  131.     var enumerator = wm.getEnumerator("navigator:browser");
  132.     while(enumerator.hasMoreElements()) {
  133.         var win = enumerator.getNext();
  134.         wincnt++;
  135.     }//while
  136.     if(wincnt == 1){return true;}    // Only one window (this one) is opened, so it must be the controller ... just return
  137.     
  138.     // More than one window is open ... assign to a different one
  139.     var enumerator = wm.getEnumerator("navigator:browser");
  140.     while(enumerator.hasMoreElements()) {
  141.         var win = enumerator.getNext();
  142.         if(win == window){
  143.             continue;
  144.         }else{
  145.             win.febeIsScheduleController = true;
  146.             win.document.getElementById("febestatusbar").hidden = febeHideIcons;
  147.             win.document.getElementById("febestatusbar").collapsed = febeHideIcons;
  148.             febeControllerWindow = win;
  149.             febeScheduleBackup();
  150.             febeSetStatus();
  151.             break;
  152.         }//if
  153.     }//while
  154.     return true;
  155. }//febeClose()
  156.  
  157. function febeLocales(){
  158.   // Return a list of installed locales
  159.  
  160.     // Parse chrome.manifest
  161.     // ex:
  162.     // locale    febe    en-US    jar:chrome/febe.jar!/locale/en-US/
  163.     // locale    febe    bg-BG    jar:chrome/febe.jar!/locale/bg-BG/
  164.     // locale    febe    da-DK    jar:chrome/febe.jar!/locale/da-DK/
  165.  
  166.     var extDir = Cc["@mozilla.org/file/directory_service;1"]
  167.         .getService(Ci.nsIProperties)
  168.         .get("ProfD", Ci.nsIFile);
  169.     
  170.     extDir.append("extensions");
  171.     extDir.append(FEBE_GUID);
  172.     extDir.append("chrome.manifest");
  173.     
  174.     // open an input stream from file
  175.     var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  176.     istream.init(extDir, 0x01, 0444, 0);
  177.     istream.QueryInterface(Ci.nsILineInputStream);
  178.     
  179.     // read lines into array
  180.     var lArray = [];
  181.     var line = {}, hasmore;
  182.     var str = "jar:chrome/febe.jar!/locale/";
  183.     do {
  184.         hasmore = istream.readLine(line);            // locale    febe    en-US    jar:chrome/febe.jar!/locale/en-US/
  185.         var idx = line.value.indexOf(str);
  186.         if(idx != -1){
  187.             var tmp = line.value.substring(idx);    // jar:chrome/febe.jar!/locale/en-US/
  188.             tmp = tmp.substring(str.length);        // en-US/
  189.             idx = tmp.indexOf("/");
  190.             tmp = tmp.substring(0,idx);                // en-US
  191.             lArray.push(tmp);
  192.         }//if
  193.         
  194.     } while(hasmore);
  195.     istream.close();
  196.     return lArray;
  197. }//febeLocales()
  198.  
  199. function febeWelcomePageDisplay(){
  200.     gBrowser.selectedTab = gBrowser.addTab(febeWelcomePage);
  201. }//febeWelcomePage()
  202.  
  203. function febeRemind(){
  204.   // See if we need to remind about a backup
  205.     var prefName = "extensions.febe.lastbackup";
  206.     if(!febePrefs.prefHasUserValue(prefName)){return true;}
  207.     var lastBU = Date.parse(febePrefs.getCharPref(prefName));
  208.     var now = Date.parse(Date());
  209.  
  210.     var reminderDays = febePrefs.getIntPref("extensions.febe.reminderdays");
  211.     if(reminderDays > 0){
  212.         if(febeReminded == true){return true;}
  213.         var elapsed = (now - lastBU) / (24 * 60 * 60 * 1000);    // Number of days since last backup
  214.         //elapsed = 100
  215.         if(elapsed >= reminderDays){
  216.             var tmp = "<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[171]+"\n";
  217.             tmp += "<style>color: black;</style>"+febeMsg[172].replace("%days%",parseInt(elapsed))+"\n";
  218.             tmp += febeLocalizedDate(lastBU)+"\n\n";
  219.             tmp += "<style>color: black;</style>"+febeMsg[232]+"\n";
  220.             tmp += "<style>color: black; font-weight: bold; font-size: 15px;</style>"+febeMsg[233]+"\n";
  221.             if(febeReminded != true){
  222.                 if(febeConfirm(tmp)){febeInit();}
  223.                 febeReminded = true;
  224.             }//if
  225.         }//if
  226.     }//if
  227.     return true;    
  228. }//febeRemind()
  229.  
  230. function febeGetEnvironmentVariableValue(envString){
  231.     var env = Cc["@mozilla.org/process/environment;1"].createInstance(Ci.nsIEnvironment);
  232.     return env.get(envString);
  233. }//febeGetEnvironmentVariableValue
  234.  
  235. function febeInit(){
  236.   // Get setup and start the backup
  237.     var d = new Date();
  238.     febeStartTime = d.getTime();
  239.   
  240.     // Set chrome priviledges
  241.     netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
  242.     netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
  243.     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
  244.  
  245.     febeVersion = febeMsg[49]+" "+getFebeVersion();
  246.     febeGetPrefs();
  247.     if(!febeGetBDD()){return false;}
  248.     
  249.     // Create timestamped directory if needed
  250.     if(febeUseTimestampedDir){
  251.         var ts = febePrefs.getCharPref("extensions.febe.timestamp.format");
  252.         if(!febeVerifyTimestamp(ts)){return false;}
  253.         febeDelTimestampDirs();
  254.         var timestamp = febeMakeTimestampName(ts);
  255.         febeBuDesDir.append(timestamp);
  256.         if(!febeBuDesDir.exists() || !febeBuDesDir.isDirectory()){
  257.             febeBuDesDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
  258.         }//if
  259.         febeExBuDir = febeBuDesDir.path;
  260.     }//if
  261.     
  262.     if(!febeSanityCheck()){return false;}
  263.     if(!febeInitDir()){return false;}
  264.     if(!febeClearDir()){return false;}
  265.     if(!febeCheckPending()){return false;}
  266.     febeFEBEbackedUp = false;
  267.     febeStartBackup();
  268.     return true;
  269. }//febeInit()
  270.  
  271. function febeMakeTimestampName(timestamp){
  272.     var d=new Date();
  273.     var YYYY = String(d.getFullYear());
  274.     var MM = String(d.getMonth()+1);
  275.     if(MM.length == 1){MM = "0" + MM;}
  276.     var DD = String(d.getDate());
  277.     if(DD.length == 1){DD = "0" + DD;}
  278.     var hh = String(d.getHours());
  279.     if(hh.length == 1){hh = "0" + hh;}
  280.     var mm = String(d.getMinutes());
  281.     if(mm.length == 1){mm = "0" + mm;}
  282.     var ss = String(d.getSeconds());
  283.     if(ss.length == 1){ss = "0" + ss;}
  284.     
  285.     timestamp = timestamp.replace("YYYY",YYYY);
  286.     timestamp = timestamp.replace("MM",MM);
  287.     timestamp = timestamp.replace("DD",DD);
  288.     timestamp = timestamp.replace("hh",hh);
  289.     timestamp = timestamp.replace("mm",mm);
  290.     timestamp = timestamp.replace("ss",ss);
  291.     return timestamp;
  292. }//febeMakeTimestampName()
  293.  
  294. function febeVerifyTimestamp(timestamp){
  295.   // Verify the timestamp mask
  296.     if(timestamp == "FEBE YYYY MM-DD hh.mm.ss"){return true;}    // ISO8601
  297.     if(timestamp == "FEBE YYYY DD.MM hh.mm.ss"){return true;}    // European
  298.     var tmp="<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[208];
  299.     tmp = tmp.replace("%TIMESTAMP%",timestamp) +"\n\n";
  300.     tmp += febeMsg[209].replace("%FORMAT1%","FEBE YYYY MM-DD hh.mm.ss")+"\n";
  301.     tmp += febeMsg[210].replace("%FORMAT2%","FEBE YYYY DD.MM hh.mm.ss")+"\n\n";
  302.     tmp += "<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[211];
  303.     febeAlert(tmp);
  304.     return false;
  305. }//febeVerifyTimestamp()
  306.  
  307. function febeVerify(verifyFileName){
  308. //return true
  309.   // Verify backup was created
  310.     if(!febeBuInProgress()){return true;} // Don't verify restores
  311.     if(febeVerifyBackups == false){return true;}
  312.     
  313.     // Check for existance of backup file every second for a maximum of 10 seconds
  314.     for(var i=0; i<5; i++){ 
  315.         var chkFile = febeBuDesDir.clone();
  316.         chkFile.append(verifyFileName);
  317.         if(chkFile.exists()){return true;}
  318.         febePause(1000);
  319.     }//for    
  320.     return false;
  321. }//febeVerify()
  322.  
  323. function febeGetBDD(){
  324.   // See if backup destination directory exists
  325.     var prefName = "extensions.febe.extBUdir";
  326.     if(febePrefs.prefHasUserValue(prefName)){
  327.         febeExBuDir = febeGetUnicharPref(prefName); 
  328.         if(febeExBuDir == ""){
  329.             if(febePlatform == 1){febeExBuDir = "C:\\";}
  330.             if(febePlatform == 2){febeExBuDir = "/";}
  331.             if(febePlatform == 3){febeExBuDir = "/";}
  332.         }//if
  333.         febeBuDesDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  334.         febeBuDesDir.initWithPath(febeExBuDir);
  335.         if (!(febeBuDesDir.exists() && febeBuDesDir.isDirectory())){
  336.             febeAlert(febeMsg[0]+" \""+febeExBuDir+"\" "+febeMsg[1]+"\n"+febeMsg[2]);
  337.             return false;
  338.         }//if
  339.     } else {
  340.         febeAlert(febeMsg[3]+"\n"+febeMsg[4]);
  341.         return false;
  342.     }//if
  343.     return true;
  344. }//febeGetBDD()
  345.  
  346. function febeDelTimestampDirs(){
  347.   // Delete timestamped directories if needed
  348.     if(febeMaxDirs == 0){return true;}    // No limit
  349.     var timestamp = febePrefs.getCharPref("extensions.febe.timestamp.format");
  350.     switch(timestamp){
  351.         case "FEBE YYYY MM-DD hh.mm.ss":
  352.             febeDelISO8601Dirs();
  353.             break;
  354.         case "FEBE YYYY DD.MM hh.mm.ss":
  355.             febeDelEuropeanDirs();
  356.             break;
  357.     }//switch
  358.     return true;
  359. }//function febeDelTimestampDirs(){
  360.  
  361. function febeDelISO8601Dirs(){
  362.   // Delete ISO8601 formated directories 
  363.     var dirArray = [];
  364.     var mask = /^FEBE \d\d\d\d \d\d-\d\d \d\d\.\d\d\.\d\d$/;
  365.     var buDirRoot = febeBuDesDir.clone();
  366.     var entries = buDirRoot.directoryEntries;
  367.     
  368.     while(entries.hasMoreElements()){
  369.         var entry = entries.getNext();
  370.         entry.QueryInterface(Ci.nsIFile);
  371.         var dirName = entry.leafName;
  372.         if(!entry.isDirectory()){continue;}
  373.         if(!dirName.match(mask)){continue;}
  374.         dirArray.push(dirName);
  375.     }
  376.     var numDirsToDelete = dirArray.length - febeMaxDirs + 1;
  377.     dirArray.sort();
  378.     for(var i=0; i<numDirsToDelete; i++){
  379.         var rmDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  380.         rmDir.initWithPath(buDirRoot.path);
  381.         rmDir.append(dirArray[i]);
  382.         rmDir.remove(true);
  383.     }//for
  384.     return true;
  385. }//febeDelTimestampDirs()
  386.  
  387. function febeDelEuropeanDirs(){
  388.   // Delete European formated directories 
  389.     var dirArray = {};
  390.     var sortArray = [];
  391.     var mask = /^FEBE \d\d\d\d \d\d.\d\d \d\d\.\d\d\.\d\d$/;
  392.     var buDirRoot = febeBuDesDir.clone();
  393.     var entries = buDirRoot.directoryEntries;
  394.     
  395.     while(entries.hasMoreElements()){
  396.         var entry = entries.getNext();
  397.         entry.QueryInterface(Ci.nsIFile);
  398.         var dirName = entry.leafName;
  399.         if(!entry.isDirectory()){continue;}
  400.         if(!dirName.match(mask)){continue;}
  401.         var ISO8601 = febeNewDirName(0,dirName);
  402.         sortArray.push(ISO8601);
  403.         dirArray[ISO8601] = dirName;
  404.     }
  405.     sortArray.sort();
  406.     var numDirsToDelete = sortArray.length - febeMaxDirs + 1;
  407.     for(var i=0; i<numDirsToDelete; i++){
  408.         var rmDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  409.         rmDir.initWithPath(buDirRoot.path);
  410.         var which = sortArray[i];
  411.         rmDir.append(dirArray[which]);
  412.         rmDir.remove(true);
  413.     }//for
  414.     return true;
  415. }//febeDelEuropeanDirs()
  416.  
  417. function febeAbortBackup(){
  418.   // Abort scheduled backup before it starts (only if statusbar icon is in "warning" state)
  419.     var d = document.getElementById("febestatusbar");
  420.     if(Boolean(d)){
  421.         //if(febeHideIcons){febeSetStatusbarVisibility2(); return true;}
  422.         var status = d.getAttribute("status");
  423.         switch(status){
  424.             case "warning":
  425.                 var tmp="<style>color: red; font-weight: bold; font-size: 15px;</style>"+febeMsg[179];
  426.                 if(!febeConfirm(tmp)){return;}
  427.  
  428.                 for(var i in febeSetTimeoutID){
  429.                     var to = new febeSetTimeoutObj;
  430.                     to.PID = febeSetTimeoutID[i].PID;
  431.                     to.Process = febeSetTimeoutID[i].Process;
  432.                     clearTimeout(to.PID);
  433.                 }//for
  434.                 febeSetTimeoutID = [];
  435.  
  436.                 febeScheduledBuTimer.cancel();
  437.                 var tmp = "<style>color: red; font-weight: bold;</style>"+febeMsg[150]+"\n";
  438.                 tmp += "<style>color: black; font-weight: bold;</style>"+febeMsg[151]+"\n";
  439.                 tmp += "<style>color: black; font-weight: normal;</style>"+febeMsg[152]+"\n";
  440.                 febeAlert(tmp);
  441.                 febePrefs.setBoolPref("extensions.febe.backupInProgress",false);    // In case it tries to start, just say no ...
  442.                 
  443.                 // Turn off scheduled backups 
  444.                 var prefName = "extensions.febe.schedule.frequency";
  445.                 febePrefs.setCharPref(prefName,"none");
  446.                 febeScheduleBackup();
  447.                 break;
  448.             case "normal":
  449.                 var prefName = "extensions.febe.schedule.description";
  450.                 var tmp = "<style>color: blue; font-weight: normal;</style>"+febeMsg[114]+"\n";
  451.                 tmp += "<style>color: black; font-weight: normal;font-family: courier;</style>"+febeGetUnicharPref(prefName)+"\n\n";
  452.                 var lastBu = febeGetUnicharPref("extensions.febe.lastbackup");
  453.                 var lastBuType = febeMsg[267];
  454.                 var prefName = "extensions.febe.lastbackup.Type";
  455.                 if(febePrefs.prefHasUserValue(prefName)){lastBuType = febeGetUnicharPref(prefName);}
  456.                 tmp += "<style>color: blue; font-weight: normal;</style>"+febeMsg[268]+" "+lastBuType+"\n";
  457.                 tmp += "<style>color: black; font-weight: normal;font-family: courier;</style>"+lastBu+"\n\n";
  458.                 tmp += "<style>color: green; font-weight: bold; font-size: 12pt;</style>"+febeMsg[266];
  459.                 var OK = febeConfirm(tmp);
  460.                 if(OK){febeInit();}
  461.                 break;
  462.             case "nobackup": 
  463.                 var tmp = "<style>color: red; font-weight: normal; font-size: 12px;</style>"+febeMsg[113]+"\n\n";
  464.                 var lastBu = febeGetUnicharPref("extensions.febe.lastbackup");
  465.                 var lastBuType = febeMsg[267];
  466.                 var prefName = "extensions.febe.lastbackup.Type";
  467.                 if(febePrefs.prefHasUserValue(prefName)){lastBuType = febeGetUnicharPref(prefName);}
  468.                 tmp += "<style>color: blue; font-weight: normal;</style>"+febeMsg[268]+" "+lastBuType+"\n";
  469.                 tmp += "<style>color: black; font-weight: normal;font-family: courier;</style>"+lastBu+"\n\n";;
  470.                 tmp += "<style>color: green; font-weight: bold; font-size: 12pt;</style>"+febeMsg[266];
  471.                 febeSetStatus();
  472.                 var OK = febeConfirm(tmp);
  473.                 if(OK){febeInit();}
  474.                 break;
  475.         }//switch
  476.     }//if
  477.     return true;
  478. }//febeAbortBackup()
  479.  
  480. function febeCheckPending(){
  481.   // See if any pending extension/theme installations exist
  482.     var prefName = "extensions.febe.warnpending";
  483.     var warn = febePrefs.getBoolPref(prefName);
  484.     
  485.     var extDir = febeProfDir.clone();
  486.     extDir.append("extensions");
  487.     extDir.append("staged-xpis");
  488.     if(!extDir.exists()){return true;}
  489.     febePendingCount = 0;
  490.     var entries = extDir.directoryEntries;
  491.     while(entries.hasMoreElements()){
  492.         entries.getNext(); 
  493.         febePendingCount++;  
  494.     }//while
  495.     var style = "<style>color: red;font-size: 12pt;</style>";
  496.     var tmp = febeMsg[212].replace("%NUM%",febePendingCount);
  497.     tmp = style+tmp+"\n\n"+febeMsg[213];
  498.     if(warn){return febeConfirm(tmp);}
  499.     return true;
  500. }//febeCheckPending()
  501.  
  502. function febeSanityCheck(){
  503.   // Check to see if there is anything to backup
  504.     var OK = (
  505.         buExtensions ||
  506.         buThemes ||
  507.         buBookmarksJSON ||
  508.         buBookmarksHTML ||
  509.         buPreferences ||
  510.         buCookies ||
  511.         buUserChrome ||
  512.         buUserPwd ||
  513.         buSearchPlugins ||
  514.         buBrowserHistory ||
  515.         buFormFillHistory ||
  516.         buPermissions ||
  517.         buUDBu ||
  518.         includeFEBE ||
  519.         buProfile);
  520.     if(!OK){febeAlert(febeMsg[131]);}
  521.     return OK;
  522. }//febeSanityCheck()
  523.  
  524. function doFebeBackup(){
  525.     febeExtensionsList = {};
  526.     febeThemesList = {};
  527.     febeErrorList = [];
  528.     febeWarningList = [];
  529.     febeDisabledCount = 0;
  530.     //febePendingCount = 0;
  531.     febeExtensionsList["**total**"] = 0;      // Associative arrays don't have a 
  532.     febeThemesList["**total**"] = 0;        // 'length' property ... So keep count
  533.     febePrefs.setBoolPref("extensions.febe.backupInProgress",true);    
  534.     if(!buProfile){
  535.         febeBackupExtensions("local");
  536.         febeBackupExtensions("global");
  537.         febeBackupBookmarksJSON();
  538.         febeBackupBookmarksHTML();
  539.         febeBackupPreferences();
  540.         febeBackupCookies();
  541.         febeBackupUserChrome();
  542.         febeBackupPasswords();
  543.         febeBackupSearchPlugins();
  544.         febeBackupBrowserHistory();
  545.         febeBackupFormFillHistory();
  546.         febeBackupPermissions();
  547.         febeBackupUDBu();
  548.         upBackedUp = false;
  549.         if(febeBUtype == "both"){
  550.             febeBackupProfile();
  551.         }//if
  552.     }else{
  553.         febeBackupProfile();
  554.     }
  555.     febeIncludeFEBE();
  556.     febeWriteResults();
  557.     febeStoreBUdate(); 
  558.     
  559.     setTimeout("febeCloseProgressWindow()",500);
  560.         
  561.     febePrefs.setBoolPref("extensions.febe.backupInProgress",false);
  562.     febeScheduleBackup();    // Schedule the next backup
  563.     febePrefs.setBoolPref("extensions.febe.backupInProgress",false);
  564.     
  565.     // Upload to box.net?
  566.     var prefName = "extensions.febe.boxnet.enabled";
  567.     var enabled = febePrefs.getBoolPref(prefName);
  568.     var prefName = "extensions.febe.boxnet.autoupload";
  569.     var upload = febePrefs.getBoolPref(prefName);
  570.     var prefName = "extensions.febe.boxnet.uploadwindow";
  571.     var dispwindow = febePrefs.getBoolPref(prefName);
  572.     
  573.     if(enabled && upload){    // Upload if requested - shutdown is initiated at the end of the upload routine if we're doing a backup on shutdown
  574.         if(dispwindow == true) {
  575.             window.openDialog('chrome://febe/content/BoxNet.html','FEBE upload', 'chrome,alwaysRaised,centerscreen,resizable,minimizable',febeMsg);
  576.         }else{    // Don't display window, but do the upload
  577.             Application.storage.set("febeMsg",febeMsg)
  578.             setTimeout('febeUploadBackup();',2000)
  579.         }//if
  580.     }else{    
  581.         if(Application.storage.get("backupOnShutdownCompleted", false)){setTimeout('febeShutdown()',3000)}    // Backup on shutdown
  582.     }//if
  583.     return true;
  584. }//doFebeBackup()
  585.  
  586. function febeCloseProgressWindow(){
  587.     // Close the progress window, dammit!
  588.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  589.     var enumerator = wm.getEnumerator("febe:progress");
  590.     while(enumerator.hasMoreElements()) {
  591.         var win = enumerator.getNext();
  592.         win.close();
  593.     }//while
  594.     febeWin.close();    // Don't just merely close, but really most sincerely close!
  595. }//febeCloseProgressWindow()
  596.  
  597. function febeShutdown(){
  598.     var application = Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup);
  599.     application.quit(application.eAttemptQuit);
  600.     return true;
  601. }//febeShutdown()
  602.  
  603. function febeStoreBUdate(){
  604.   // Write last backup info to preferences
  605.     var prefName = "extensions.febe.lastbackup";
  606.     var dflt = new Date();
  607.     febeSetUnicharPref(prefName,dflt);
  608.     var prefName = "extensions.febe.lastbackup.folder";
  609.     febeSetUnicharPref(prefName,febeBuDesDir.path);
  610.     return true;
  611. }//febeStoreBUdate()
  612.  
  613. function febeIncludeFEBE(){
  614.   // Include a copy of FEBE with backup
  615.     if(!includeFEBE){return;}
  616.     if(febeFEBEbackedUp){return;}    // Don't need two copies!  Was aready backed up during extension backup.
  617.     var extDir = FEBEdir.clone();        
  618.     var srcName = extDir.clone();
  619.     srcName = srcName.path;
  620.     var extBuName = "FEBE.xpi";
  621.     
  622.     febeZip(srcName,febeExBuDir,extBuName,false,false);
  623.     
  624.     exBackedUp = true;
  625.     var thisExt = new febeExtInfo(FEBE_GUID);
  626.     if(!thisExt) return false;
  627.     
  628.     var item = new febeExtObj;
  629.     item.Name = "FEBE";
  630.     item.Path = "";
  631.     item.Icon = thisExt.iconURL;
  632.     item.Home = thisExt.homepageURL;
  633.     item.guid = FEBE_GUID;
  634.     item.verified = febeVerify(extBuName);
  635.     febeExtensionsList[item.Name] = item;
  636.     febeExtensionsList["**total**"]++;    
  637.     return true;
  638. }//febeIncludeFEBE()
  639.  
  640. function febeWriteResults(){
  641.  // Stop timer
  642.     var d = new Date();
  643.     var febeStopTime = d.getTime();
  644.     var elapsedTime =  (febeStopTime - febeStartTime)/1000;
  645.     
  646.   // Create results page    
  647.     febeUpdateProgressWindow(febeMsg[77]);
  648.     
  649.     // Pointer to results page html file
  650.     var febeResultsPage = FEBEdir.clone();
  651.     febeResultsPage.append("FEBEresults.html");
  652.         
  653.   // Open results page for writing
  654.     var resultsFile = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  655.     resultsFile.init(febeResultsPage, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  656.     
  657.   // Get results template
  658.     var resultsTemplate=getFebeResultsTemplate("chrome://febe/content/FEBEresultsTemplate.html")
  659.     
  660.   // Detail or summary?    
  661.     var format = febePrefs.getCharPref("extensions.febe.resultsFormat");
  662.     var detail = Boolean(false);
  663.     if(format == "detail"){detail = true;}
  664.   
  665.   // Add results to results page
  666.     var middle = new String();
  667.     var cnt = 0;
  668.         
  669.   // Create the new content
  670.     var numExt = parseInt(febeExtensionsList["**total**"]);
  671.     var numThemes = parseInt(febeThemesList["**total**"]);
  672.  
  673.     delete febeExtensionsList["**total**"];
  674.     delete febeThemesList["**total**"];
  675.  
  676.     // Sort using key array
  677.     var febeExtKey = [];
  678.     var febeThemeKey = [];
  679.     for(var i in febeExtensionsList){
  680.         febeExtKey.push(febeExtensionsList[i].Name);
  681.     }//for
  682.  
  683.     for(var i in febeThemesList){
  684.         febeThemeKey.push(febeThemesList[i].Name);
  685.     }//for
  686.     febeExtKey.sort();
  687.     febeThemeKey.sort();
  688.  
  689.     var total = numExt + numThemes;
  690.     if (bmBackedUpJSON){total++};
  691.     if (bmBackedUpHTML){total++};
  692.     if (prBackedUp){total++};
  693.     if (ckBackedUp){total++};
  694.     if (chBackedUp){total++};
  695.     if (ucBackedUp){total++};
  696.     if (pwBackedUp){total++};
  697.     if (pdBackedUp){total++};
  698.     if (spBackedUp){total++};
  699.     if (hsBackedUp){total++};
  700.     if (ffBackedUp){total++};
  701.     if (pmBackedUp){total++};
  702.     if (upBackedUp){total++};
  703.     total += udBackedUp;
  704.  
  705.     var re = new RegExp("\\\\", "g");
  706.     var errCnt = 0;
  707.     var warnCnt = 0;
  708.     var imgstyle = ' height="16" width="16" '
  709.     var table = ['<table border="0" cellpadding="2" cellspacing="2">\n<tbody>',"</tbody>\n</table>"];
  710.     var tr = ["<tr>\n","</tr>\n"];
  711.     var tdnum = ['<td style="vertical-align: middle; text-align: right;"><num>'
  712.             ,"</num></td>\n"];
  713.     var tdimg = ['<td style="text-align: center;">','</td>\n'];
  714.     var tdnolink = ['<td style="font-weight: bold;"><nolink>','</nolink></td>\n'];
  715.     var tdlink = ['<td style="font-weight: bold;">','</td>\n']
  716.     var tdguid = ['<td><guid>','</guid></td>\n'];
  717.     var div = ['<div style="text-align:left; direction: ltr;">\n',"</div>\n"];
  718.     var disabledIndicator = '<img src="chrome://febe/skin/disabled.png"'+imgstyle+'>';
  719.     var useragent = ['<useragent>','</useragent>'];
  720.     middle += febeLocalizedDate(Date())+"<br>\n";
  721.     middle += "<p>"+febeMsg[285]+" "+febeGetUnicharPref("extensions.febe.lastbackup.Type");
  722.     middle += "  —  <i>"+febeMsg[284].replace("%SECONDS%",elapsedTime)+"</i><br><br>\n"    
  723.     middle += febeMsg[12]+"     "+total+" "+febeMsg[13];
  724.     var prefix = "file://";
  725.     if (febeExBuDir.substring(0,2) == "\\\\"){prefix = "file:///"}    // add extra "\" for networked drive
  726.     middle += "  <i>("+febeMsg[15]+' <a href=\"'+prefix+febeExBuDir.replace(re,"/")+'\">'+febeExBuDir+"</a>)</i></p>\n";
  727.         
  728.     if ((total) != 0){
  729.         if (numExt != 0){
  730.             middle += "<p>"+febeMsg[14]+" ("+numExt+" "+febeMsg[13]+")\n";
  731.             if(febeDisabledCount != 0){
  732.                 middle += "<br><i>*** "+febeMsg[107].replace("%num%",febeDisabledCount)+"</i>\n";
  733.             }else{
  734.                 middle += " - "+febeMsg[120].replace("%disabled%",disabledIndicator)+"\n";
  735.             }//if
  736.             if(febePendingCount != 0){
  737.                 middle += "<br><i>*** "+febeMsg[278].replace("%num%",febePendingCount)+"</i>\n";
  738.             }//if
  739.             if(detail == true){
  740.                 middle += "</p>\n"+div[0]+table[0];
  741.                 var item = new febeExtObj;
  742.                 for(var i=0; i<febeExtKey.length; i++){
  743.                     var key = febeExtKey[i];
  744.                     item = febeExtensionsList[key];
  745.                     if(item.verified == false){
  746.                         febeErrorList.push(febeMsg[18]+" "+item.Name);
  747.                         errCnt++;
  748.                         continue;
  749.                     }//if
  750.                     cnt++;
  751.                     middle += tr[0];
  752.                     middle += tdnum[0]+cnt+"."+tdnum[1];
  753.                     middle += tdimg[0]+"<img src='"+item.Icon+"'"+imgstyle+">"+tdimg[1];
  754.                     var thisExt = new febeExtInfo(item.guid);
  755.                     if(!thisExt) continue;
  756.                     var tmp = item.Name;
  757.                     if(thisExt.isDisabled){
  758.                         tmp = "<i>"+tmp+"</i>";
  759.                     }else{
  760.                         tmp = tmp;
  761.                     }//if
  762.                     
  763.                     var desc = thisExt.description;
  764.                     desc = "<span class='description'>   -- "+desc+"</span>";
  765.                     
  766.                     if(item.Home != ""){
  767.                         middle += tdlink[0]+"<a href="+item.Home+">"+tmp+"</a>"+desc+tdlink[1];
  768.                     }else{
  769.                         middle += tdnolink[0]+tmp+desc+tdnolink[1];
  770.                     }//if    
  771.                     middle += tr[1];
  772.                 }//for
  773.                 middle += table[1]+div[1];
  774.             }//if
  775.         }//if
  776.         
  777.         if (numThemes != 0){
  778.             cnt = 0;
  779.             middle += "<p>"+febeMsg[16]+" ("+numThemes+" "+febeMsg[13]+")</p>\n";
  780.             if(detail == true){
  781.                 middle += div[0]+table[0];
  782.                 var item = new febeExtObj;
  783.                 for(var i=0; i<febeThemeKey.length; i++){
  784.                     var key = febeThemeKey[i];
  785.                     item = febeThemesList[key];
  786.                     if(item.verified == false){
  787.                         febeErrorList.push(febeMsg[18]+" "+item.Name);
  788.                         errCnt++;
  789.                         continue;
  790.                     }//if
  791.                     cnt++;
  792.                     middle += tr[0];
  793.                     middle += tdnum[0]+cnt+"."+tdnum[1];
  794.                     middle += tdimg[0]+"<img src='"+item.Icon+"'"+imgstyle+">"+tdimg[1];
  795.                     var thisExt = new febeExtInfo(item.guid);
  796.                     if(!thisExt) continue;
  797.  
  798.                     var tmp = item.Name;
  799.                     var desc = thisExt.description;
  800.                     desc = "<span class='description'>   -- "+desc+"</span>";
  801.                     if(item.Home){
  802.                         middle += tdlink[0]+"<a href="+item.Home+">"+tmp+"</a>"+desc+tdlink[1];
  803.                     }else{
  804.                         middle += tdnolink[0]+tmp+desc+tdnolink[1];
  805.                     }//if    
  806.                     middle += tr[1];
  807.                 }//for
  808.                 middle += table[1]+div[1];
  809.             }//if
  810.         }//if
  811.     }else{
  812.         febeErrorList.push("<p>"+febeMsg[19]+"</p>\n");
  813.         errCnt++;
  814.     }//if
  815.     
  816.     middle += "<p>";
  817.     if(!buProfile){
  818.         // Optional backups
  819.         if (buBookmarksJSON){
  820.             if (bmBackedUpJSON){
  821.                 middle +=febeMsg[27]+" <b>"+bmBuNameJSON+"</b><br>\n"
  822.             }else{
  823.                 febeErrorList.push(febeMsg[30]);
  824.                 errCnt++;
  825.             }//if
  826.         }//if
  827.         if (buBookmarksHTML){
  828.             if (bmBackedUpHTML){
  829.                 middle +=febeMsg[27]+" <b>"+bmBuNameHTML+"</b><br>\n"
  830.             }else{
  831.                 febeErrorList.push(febeMsg[30]);
  832.                 errCnt++;
  833.             }//if
  834.         }//if
  835.         if (buPreferences){
  836.             if (prBackedUp){
  837.                 middle +=febeMsg[28]+" <b>"+prBuName+"</b><br>\n"
  838.             }else{
  839.                 febeWarningList.push(febeMsg[31]);
  840.                 warnCnt++;
  841.             }//if
  842.         }//if
  843.         if (buCookies){
  844.             if (ckBackedUp){
  845.                 middle +=febeMsg[29]+" <b>"+ckBuName+"</b><br>\n"
  846.             }else{
  847.                 febeWarningList.push(febeMsg[32]);
  848.                 warnCnt++;
  849.             }//if    
  850.         }//if    
  851.             if (buUserChrome){
  852.             if (chBackedUp){
  853.                 middle +=febeMsg[52]+" <b>"+chBuName+"</b><br>\n"
  854.             }else{
  855.                 febeWarningList.push(febeMsg[60]);
  856.                 warnCnt++;
  857.             }//if
  858.         }//if    
  859.             if (buUserPwd){
  860.             if (pwBackedUp){
  861.                 middle +=febeMsg[54]+" <b>"+pwBuName+"</b><br>\n"
  862.             }else{
  863.                 febeWarningList.push(febeMsg[62]);
  864.                 warnCnt++;
  865.             }//if    
  866.         }//if
  867.             if (buSearchPlugins){
  868.             if (spBackedUp){
  869.                 middle +=febeMsg[56]+" <b>"+spBuName+"</b><br>\n"
  870.             }else{
  871.                 febeWarningList.push(febeMsg[64]);
  872.                 warnCnt++;
  873.             }//if
  874.         }//if    
  875.             if (buBrowserHistory){
  876.             if (hsBackedUp){
  877.                 middle +=febeMsg[57]+" <b>"+hsBuName+"</b><br>\n"
  878.             }else{
  879.                 febeWarningList.push(febeMsg[65]);
  880.                 warnCnt++;
  881.             }//if
  882.         }//if    
  883.             if (buFormFillHistory){
  884.             if (ffBackedUp){
  885.                 middle +=febeMsg[58]+" <b>"+ffBuName+"</b><br>\n"
  886.             }else{
  887.                 febeWarningList.push(febeMsg[66]);
  888.                 warnCnt++;
  889.             }//if
  890.         }//if    
  891.             if (buPermissions){
  892.             if (pmBackedUp){
  893.                 middle +=febeMsg[116]+" <b>"+pmBuName+"</b><br>\n"
  894.             }else{
  895.                 febeWarningList.push(febeMsg[115]);
  896.                 warnCnt++;
  897.             }//if
  898.         }//if    
  899.         if (buUDBu){
  900.             for(var i in febeUDBuDone){
  901.                 var item = new febeUDBuDoneObj;
  902.                 item.Description = febeUDBuDone[i].Description;
  903.                 item.Name = febeUDBuDone[i].Name;
  904.                 var tmp = febeMsg[148].replace("%description%","\""+item.Description+"\"");
  905.                 tmp = tmp.replace("%name%"," <b>"+item.Name+"</b><br>\n");
  906.                 middle += tmp;
  907.             }//for
  908.         }//if    
  909.     }//if
  910.     if(buProfile == true || febeBUtype == "both"){
  911.         if (upBackedUp){
  912.             middle +=febeMsg[59]+" <b>"+upBuName+"</b><br>\n"
  913.         }else{
  914.             febeErrorList.push(febeMsg[67]);
  915.             errCnt++;
  916.         }//if    
  917.     }//if
  918.     middle += "</p>\n";
  919.     
  920.   // Write the final results
  921.     var pageSource = resultsTemplate.replace("%title%", febeMsg[108]);
  922.     pageSource = resultsTemplate.replace("%title%", febeMsg[108]);
  923.     pageSource = pageSource.replace("%reportheading%", febeMsg[109]);
  924.     pageSource = pageSource.replace("%version%", febeVersion);
  925.     pageSource = pageSource.replace("%by%", febeMsg[180]);
  926.     pageSource = pageSource.replace("%results%", middle);
  927.     var prefName = "extensions.febe.orientation";
  928.     var orientation = febePrefs.getCharPref(prefName);
  929.     pageSource = pageSource.replace("%orientation%", orientation);
  930.     middle = "";
  931.     if(errCnt != 0){
  932.         pageSource = pageSource.replace("%errmsg%", "<errh>"+errCnt+" "+febeMsg[112]+"</errh>");
  933.         middle = div[0];
  934.         for(var i=0; i<febeErrorList.length; i++){
  935.             middle += "<err>"+febeErrorList[i]+"</err><br>\n";
  936.         }//for
  937.         middle += div[1];
  938.         pageSource = pageSource.replace("%errlist%", middle);
  939.     }else{
  940.         pageSource = pageSource.replace("%errmsg%<br>", "<!-- %errmsg% -->\n");
  941.         pageSource = pageSource.replace("%errlist%<br>", "<!-- %errlist% -->\n");
  942.     }//if
  943.     if(warnCnt != 0){
  944.         pageSource = pageSource.replace("%warnmsg%", "<warnh>"+warnCnt+" "+febeMsg[132]+"</warnh>");
  945.         middle = div[0];
  946.         for(var i=0; i<febeWarningList.length; i++){
  947.             middle += "<warn>"+febeWarningList[i]+"</warn><br>\n";
  948.         }//for
  949.         middle += div[1];
  950.         pageSource = pageSource.replace("%warnlist%", middle);
  951.     }else{
  952.         pageSource = pageSource.replace("%warnmsg%<br>", "<!-- %warnmsg% -->\n");
  953.         pageSource = pageSource.replace("%warnlist%<br>", "<!-- %warnlist% -->\n");
  954.     }//if
  955.     
  956.     if(febePrefs.getBoolPref("extensions.febe.boxnet.enabled") && febePrefs.getBoolPref("extensions.febe.boxnet.autoupload")){
  957.         var boxmsg = '<div style="text-align:left; color: green; font-weight: bold;">'+febeMsg[265]+"</div><br></br>";
  958.         pageSource = pageSource.replace("%boxupload%", boxmsg);
  959.     }else{
  960.         pageSource = pageSource.replace("%boxupload%", "<!-- %boxupload% -->\n");
  961.     }//if
  962.     
  963.     pageSource = pageSource.replace("%useragent%", useragent[0]+febeMsg[191] + " " + navigator.userAgent+useragent[1]);
  964.     pageSource = pageSource.replace("%hompagemsg%", febeMsg[110]);
  965.     pageSource = pageSource.replace("%linkmsg%", febeMsg[111]);
  966.     
  967.     // Create an UTF-8 output stream
  968.     var charset = "UTF-8";
  969.     var os = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  970.  
  971.     os.init(resultsFile, charset, 4096, 0x0000);
  972.     os.writeString(pageSource);
  973.     os.close();
  974.     
  975.   // Open and display results
  976.     if(errCnt == 0){
  977.         febePlaySound("success");
  978.     }else{
  979.         febePlaySound("failure");
  980.     }//if    
  981.     var finalPage = "chrome://febe/content/febeResultsLoad.html";
  982.     if(febeDispResults){
  983.         febeOpenResultsPage(finalPage);
  984.     }//if
  985.     if(febeSaveResults){
  986.       // Save results page with backup
  987.         var timestamp = febePrefs.getCharPref("extensions.febe.timestamp.format");
  988.         var d=new Date();
  989.         var YYYY = String(d.getFullYear());
  990.         var MM = String(d.getMonth()+1);
  991.         if(MM.length == 1){MM = "0" + MM;}
  992.         var DD = String(d.getDate());
  993.         if(DD.length == 1){DD = "0" + DD;}
  994.         var hh = String(d.getHours());
  995.         if(hh.length == 1){hh = "0" + hh;}
  996.         var mm = String(d.getMinutes());
  997.         if(mm.length == 1){mm = "0" + mm;}
  998.         var ss = String(d.getSeconds());
  999.         if(ss.length == 1){ss = "0" + ss;}
  1000.         
  1001.         timestamp = timestamp.replace("YYYY",YYYY);
  1002.         timestamp = timestamp.replace("MM",MM);
  1003.         timestamp = timestamp.replace("DD",DD);
  1004.         timestamp = timestamp.replace("hh",hh);
  1005.         timestamp = timestamp.replace("mm",mm);
  1006.         timestamp = timestamp.replace("ss",ss);
  1007.  
  1008.         var dName = febeMsg[76]+" - "+timestamp+".html"; 
  1009.         febeCopyFile(febeResultsPage.path,febeBuDesDir.path,dName);
  1010.     }//if
  1011.     
  1012.     // Set last backup type in preferences
  1013.     var lastbutype;
  1014.     if(buProfile == false){
  1015.         lastbutype = "selective"
  1016.     }else{
  1017.         lastbutype = "profile";
  1018.     }//if
  1019.     febePrefs.setCharPref("extensions.febe.lastbackup.type", lastbutype);
  1020.     return true;
  1021. }//febeWriteResults()
  1022.  
  1023. function febeWarn(){
  1024.   // Display scheduled backup warning in statusbar
  1025.     if(!febeIsScheduleController) {return true;}
  1026.     if(febeHideIcons){return true;}
  1027.     var d = febeControllerWindow.document.getElementById("febestatusbar");
  1028.     d.setAttribute("status","warning");
  1029.     febePlaySound("warning");
  1030.     for(var i=10000; i<= 40000; i += 10000){
  1031.         var to = new febeSetTimeoutObj;
  1032.         to.PID = setTimeout('febePlaySound("warning")',i)
  1033.         to.Process = 'febePlaySound("warning")';
  1034.         febeSetTimeoutID.push(to);
  1035.     }//for
  1036.     return true;
  1037. }//febeWarn()
  1038.  
  1039. function febeDebug(aMsg) {
  1040.    setTimeout(function() { throw new Error("[debug] " + aMsg); }, 0);
  1041.    return true;
  1042. }//debug
  1043.  
  1044. function febePickFiles(filter,msgNum){
  1045.   // Select extension/themes to install
  1046.     const nsIFilePicker = Ci.nsIFilePicker;
  1047.     var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  1048.     fp.init(window, febeMsg[msgNum], nsIFilePicker.modeOpenMultiple);
  1049.     fp.appendFilter(filter,filter);
  1050.     
  1051.     // Set the default directory to the backup destination directory
  1052.     var prefName = "extensions.febe.extBUdir";
  1053.     if(!febePrefs.prefHasUserValue(prefName)){
  1054.         febeGetPrefs();
  1055.         if(febePlatform == 1){febeExBuDir = "C:\\";}
  1056.         if(febePlatform == 2){febeExBuDir = "/";}
  1057.         if(febePlatform == 3){febeExBuDir = "/";}
  1058.     }else{
  1059.         febeExBuDir = febeGetUnicharPref(prefName);
  1060.     }//if
  1061.     
  1062.     if(febeExBuDir != ""){
  1063.         var aDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1064.         aDir.initWithPath(febeExBuDir);
  1065.         fp.displayDirectory = aDir;
  1066.     }//if
  1067.  
  1068.     var rv = fp.show();
  1069.     febeETinstall = [];
  1070.     if (rv == nsIFilePicker.returnOK){
  1071.         var files = fp.files;
  1072.         while(files.hasMoreElements()) {
  1073.             var file = files.getNext()
  1074.                 .QueryInterface(Ci.nsILocalFile);
  1075.             var obj = new febeExtObj;
  1076.             obj.Name = file.leafName;
  1077.             obj.Path = file.path;
  1078.             febeETinstall.push(obj);
  1079.         }//while
  1080.     }//if
  1081.     return true;
  1082. }//febePickFiles()
  1083.  
  1084. function febeStartBackup(){
  1085.     if(febeBuInProgress()){
  1086.         if(!febeBuInProgressCheck()) {return false;}
  1087.     }//if
  1088.     var win = febeControllerWindow;
  1089.     try{
  1090.         if(win.document.getElementById("febeTLBRbutton")){
  1091.             win.document.getElementById("febeTLBRbutton").status = "disabled";
  1092.             win.document.getElementById("febeTLBRbutton").hidden = "true";
  1093.         }//if
  1094.     }catch(e){;}
  1095.     if(febeDispProgress == true){
  1096.         // Open the progress window
  1097.         febeWin = openDialog("chrome://febe/content/febeProgress.xul", "FEBE", "chrome,alwaysRaised,centerscreen,dialog='no',modal='no'");
  1098.         // Give the browser a chance to display the progress window before the backup starts
  1099.         setTimeout('doFebeBackup()',1000);
  1100.     }else{
  1101.         febeGetBuType();
  1102.         doFebeBackup();
  1103.     }//if
  1104.     
  1105.     try{
  1106.         if(win.document.getElementById("febeTLBRbutton")){
  1107.             win.document.getElementById("febeTLBRbutton").setAttribute("status","normal");
  1108.             win.document.getElementById("febeTLBRbutton").setAttribute("hidden","false");
  1109.         }//if
  1110.         win.document.getElementById("febestatusbar").Class = "statusbarpanel-iconic febe-normal";
  1111.         win.document.getElementById("febestatusbar").hidden = febeHideIcons;
  1112.         win.document.getElementById("febestatusbar").collapsed = febeHideIcons;
  1113.     }catch(e){;}
  1114.     var win = "";    // Clear memory
  1115.     return true;
  1116. }//febeStartBackup()
  1117.  
  1118. function getFebeResultsTemplate(aURL){
  1119.     var req = new XMLHttpRequest();
  1120.     req.open('GET', aURL, false);
  1121.     req.send(null);
  1122.     return req.responseText;
  1123. }//getFebeResultsTemplate()
  1124.  
  1125. function febeDirCopy(sourceDir){
  1126. // Recursively copy individual files and sub-directories to a destination directory
  1127. // 
  1128. // Example:
  1129. //    sourceDir (intially) = [profiledir]/extensions
  1130. //    febeSubRootDir = {4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  1131. //    febeDestDir = nsIFile to [temp]/febe.tmp
  1132. //
  1133. //        All files and sub-directories in [profiledir]/extensions/{4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  1134. //        will be copied to [temp]/febe.tmp/{4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  1135.  
  1136.     var tmp = "sourceDir: "+sourceDir;
  1137.     tmp += "\nfebeSubRootDir: "+febeSubRootDir;
  1138.     tmp += "\nfebeDestDir: "+febeDestDir.path;
  1139.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1140.     if (!aFile) return false;
  1141.  
  1142.     aFile.initWithPath(sourceDir);
  1143.     var entries = aFile.directoryEntries;
  1144.     
  1145.     while(entries.hasMoreElements()){
  1146.         var entry = entries.getNext();
  1147.         entry.QueryInterface(Ci.nsIFile);
  1148.         var src = entry.path;
  1149.         var p = src.indexOf(febeSubRootDir)
  1150.         if(p == -1){continue;}
  1151.         if(entry.isDirectory()){
  1152.             febeDirCopy(src);
  1153.         }else{
  1154.             var parentPath = entry.parent.path;
  1155.             var dest = febeDestDir.path+"\\"+parentPath.substring(p);
  1156.             var file = entry.leafName;
  1157.             febeCopyFile(src,dest,file);
  1158.         }//if
  1159.     }//while
  1160.     return true;
  1161. }//febeDirCopy()
  1162.  
  1163. function febePickFile(filter,msgNum){
  1164.   // Select a file to restore
  1165.     const nsIFilePicker = Ci.nsIFilePicker;
  1166.     var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  1167.     fp.init(window, febeMsg[msgNum], nsIFilePicker.modeOpen);
  1168.     
  1169.     // Fix for mac - Can't handle strings like "bookmarks*.json". - Change to "*.json"
  1170.     if(febePlatform == 3){
  1171.         var n = filter.indexOf("*");
  1172.         filter = filter.substr(n);
  1173.     }//if
  1174.     fp.appendFilter(filter,filter);
  1175.     
  1176.     // Set the default directory to the backup destination directory
  1177.     var prefName = "extensions.febe.extBUdir";
  1178.     if(!febePrefs.prefHasUserValue(prefName)){
  1179.         febeGetPrefs();
  1180.         if(febePlatform == 1){febeExBuDir = "C:\\";}
  1181.         if(febePlatform == 2){febeExBuDir = "/";}
  1182.         if(febePlatform == 3){febeExBuDir = "/";}
  1183.     }else{
  1184.         febeExBuDir = febeGetUnicharPref(prefName);
  1185.     }//if
  1186.     if(febeExBuDir != ""){
  1187.         var aDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1188.         aDir.initWithPath(febeExBuDir);
  1189.         fp.displayDirectory = aDir;
  1190.     }//if
  1191.  
  1192.     var rv = fp.show();
  1193.     if (rv == nsIFilePicker.returnOK){
  1194.         rv = fp.file;
  1195.         febePathName = rv.path;
  1196.         febePrName = febePfName = rv.leafName;
  1197.         febePfParent = rv.parent.path;
  1198.         return true;
  1199.     }//if
  1200.     return false;
  1201. }//febePickFile()
  1202.  
  1203. function febeConfirmRestore(msgNum,bDate){
  1204.     febeGetPlatform();
  1205.     if(febePlatform == 3){return true;}    // Mac can't handle modal alerts properly, so just assume they clicked "OK"
  1206.     var style = "<style>color: red;font-size: 14pt;</style>";
  1207.     var tmp = style+febeMsg[36] +"\n";
  1208.     tmp += febeMsg[msgNum] + "\n";
  1209.     if(bDate != ""){tmp += febeLocalizedDate(bDate) + "\n";}
  1210.     tmp += "\n";
  1211.     if(bDate != ""){tmp += febeMsg[45] + "\n";} 
  1212.     tmp += febeMsg[40];
  1213.     tmp += "\n" + febeMsg[41];
  1214.     return febeConfirm(tmp);
  1215. }//febeConfirmRestore()
  1216.  
  1217. function febeUpdateProgressWindow(pMsg){
  1218.     if(!febeDispProgress) return true;
  1219.     try{
  1220.         var pMsgField = febeWin.document.getElementById("febeProgressText");
  1221.         if(pMsgField){pMsgField.setAttribute("value",pMsg)};
  1222.         febeWin.focus();
  1223.     }catch(e){;}
  1224.     return true;
  1225. }//febeUpdateProgressWindow()
  1226.  
  1227. function febeInitDir(){
  1228.     exBackedUp = false;
  1229.     thBackedUp = false;
  1230.     bmBackedUp = false;
  1231.     prBackedUp = false;
  1232.     ckBackedUp = false;
  1233.     chBackedUp = false;
  1234.     ucBackedUp = false;
  1235.     pwBackedUp = false;
  1236.     pdBackedUp = false;
  1237.     spBackedUp = false;
  1238.     hsBackedUp = false;
  1239.     ffBackedUp = false;
  1240.     pmBackedUp = false;
  1241.     upBackedUp = false;
  1242.     
  1243.     // Get platform
  1244.     febePlatform = febeGetPlatform();
  1245.     
  1246.     // Get pointer to FEBE extension directory
  1247.     FEBEdir = Cc["@mozilla.org/extensions/manager;1"]
  1248.               .getService(Ci.nsIExtensionManager)
  1249.               .getInstallLocation(FEBE_GUID)
  1250.               .getItemLocation(FEBE_GUID);
  1251.     
  1252.     if(febeInitialized == true){return true;}    // Only run the rest of this routine once
  1253.     febeInitialized = true;    
  1254.  
  1255.     // Create pointer to profile directory
  1256.     febeProfDir = Cc["@mozilla.org/file/directory_service;1"]
  1257.         .getService(Ci.nsIProperties)
  1258.         .get("ProfD", Ci.nsIFile);
  1259.     
  1260.     // Get profile name
  1261.     var tmp = "";
  1262.     for (i = febeProfDir.path.length; i > 0; i--){
  1263.         var c = febeProfDir.path.charAt(i);
  1264.         var delimiter = "\\"
  1265.         if(febePlatform == 2){delimiter = "/";}    // *nix
  1266.         if(febePlatform == 3){delimiter = "/";}    // Mac
  1267.         if( c == delimiter ){
  1268.             break;
  1269.         }else{
  1270.             tmp = c + tmp;
  1271.         }
  1272.     }//for
  1273.     var p = tmp.indexOf(".")
  1274.     febeProfName  = tmp.substr(p+1);
  1275.     return true;
  1276. }//febeInitDir()
  1277.  
  1278. function febeClearDir(){
  1279.    // Clear destination directory
  1280.     if(febeClearDestDir == false){return true;}
  1281.     var entries = febeBuDesDir.directoryEntries;
  1282.     var numFiles = 0;
  1283.     var numDirs = 0;
  1284.     while(entries.hasMoreElements()){
  1285.         var entry = entries.getNext();
  1286.         entry.QueryInterface(Ci.nsIFile);
  1287.         if(entry.isFile()){numFiles++;}
  1288.         if(entry.isDirectory()){numDirs++;}
  1289.     }//while
  1290.  
  1291.     // Warn before delete?
  1292.     var clearWarning = Boolean(false);
  1293.     var prefName = "extensions.febe.clearwarning";
  1294.     if(febePrefs.prefHasUserValue(prefName)){
  1295.         clearWarning = febePrefs.getBoolPref(prefName);
  1296.     } else {
  1297.         febePrefs.setBoolPref(prefName,true);
  1298.         clearWarning = false;
  1299.     }//if
  1300.     
  1301.     if((clearWarning) && numFiles != 0){
  1302.         var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
  1303.         var checkResult = {};
  1304.  
  1305.         var x1 = new RegExp("x1");
  1306.         var x2 = new RegExp("x2");
  1307.         var tmp = febeMsg[99];
  1308.         tmp = tmp.replace(x1,numFiles);
  1309.         tmp = tmp.replace(x2,numDirs);
  1310.         tmp += "\n"+febeMsg[100];
  1311.     
  1312.         var OK = febeConfirm(tmp);
  1313.         if(!OK){return false;}
  1314.     }//if
  1315.     
  1316.     var entries = febeBuDesDir.directoryEntries;
  1317.     while(entries.hasMoreElements()){
  1318.         var entry = entries.getNext();
  1319.         entry.QueryInterface(Ci.nsIFile);
  1320.         if(entry.isFile()){entry.remove(false);}
  1321.     }//while
  1322.     return true;
  1323. }//febeClearDir()
  1324.  
  1325. function febeDosHappy(aString){
  1326.     // Mask out DOS incompatable characters
  1327.     if(febePlatform != 1){return aString;}
  1328.     var badList = "\\/:*\"<>|";
  1329.     for (var i = 0; i < aString.length; i++){    
  1330.         var c = aString.charAt(i);
  1331.         var OK = Boolean(true);
  1332.         for (var j = 0; j < badList.length; j++){
  1333.             var tChar = badList.charAt(j);
  1334.             if(c == tChar){
  1335.                 OK = false;
  1336.                 break;
  1337.             }//if
  1338.         }//for
  1339.         if(OK == false){aString = aString.replace(c,"_");}
  1340.     }//for
  1341.  
  1342.     /*
  1343.     var goodList = " .@-_(){}!+";
  1344.     goodList += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  1345.     goodList += "abcdefghijklmnopqrstuvwxyz";
  1346.     goodList += "0123456789";
  1347.     for (var i = 0; i < aString.length; i++){    
  1348.         var c = aString.charAt(i);
  1349.         var OK = Boolean(false);
  1350.         for (var j = 0; j < goodList.length; j++){
  1351.             var tChar = goodList.charAt(j);
  1352.             //print(c+" : "+tChar+" : "+OK)
  1353.             if(c == tChar){
  1354.                 OK = true;
  1355.                 break;
  1356.             }//if
  1357.         }//for
  1358.         if(OK == false){aString = aString.replace(c,"_");}
  1359.     }//for
  1360. */
  1361.     return aString;
  1362. }//febeDosHappy
  1363.  
  1364. function febeSetStatusbarMsg(){
  1365.   // This doesn't work - statusbar never updates
  1366.     return true;
  1367.     var d = document.getElementById("febestatusbarprogress");
  1368.     var msg = febeMsg[243].replace("%ITEM%",febeLocalizedStr["current"]);
  1369.     d.setAttribute("label",msg);
  1370.     return true;
  1371. }//febeSetStatusbarMsg()
  1372.  
  1373. function febeSetProgressText(){
  1374.     var txt = febeGetUnicharPref("extensions.febe.lastbackup.Type");
  1375.     var d = document.getElementById("febeProgressType");
  1376.     var str = d.value;
  1377.     str = str.replace("$TYPE$",txt);
  1378.     d.setAttribute("value",str);
  1379.     return true;
  1380. }//febeSetProgressText()
  1381.  
  1382. function febeSetStatusbarVisibility2(){
  1383.     febeHideIcons = febePrefs.getBoolPref("extensions.febe.hideIcons");
  1384.     var d = window.document.getElementById("febestatusbar");
  1385.     if(!Boolean(d)){return false;}
  1386.     if(febeIsScheduleController){
  1387.         setTimeout(function(){d.hidden = d.collapsed = febeHideIcons;},1000);
  1388.     }else{
  1389.         setTimeout(function(){d.hidden = d.collapsed = true;},1000);
  1390.     }//if
  1391.     return true;
  1392. }//febeSetStatusbarVisibility2()
  1393.  
  1394. // ------------------ Backup Functions --------------------
  1395.  
  1396. function febeBackupExtensions(type){
  1397.   // Backup extensions and themes
  1398.     if(type == "local"){
  1399.         var extDir = febeProfDir.clone();
  1400.     }else{
  1401.         if(!febePrefs.getBoolPref("extensions.febe.includeGlobal")){return true;};
  1402.         var extDir = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("CurProcD", Ci.nsIFile);
  1403.     }//if
  1404.     
  1405.     extDir.append("extensions");
  1406.     var entries = extDir.directoryEntries;
  1407.  
  1408.     if(buExtensions == false && buThemes == false){return true;}
  1409.  
  1410.     while(entries.hasMoreElements()){
  1411.         var entry = entries.getNext();
  1412.         entry.QueryInterface(Ci.nsIFile);
  1413.         if(!entry.isDirectory()){continue;}    // Don't process junk in the extension directory
  1414.         if(entry.leafName == "staged-xpis"){continue;}    // Don't process pending extensions directory
  1415.         extGUID = entry.leafName;
  1416.         if(extGUID == "{972ce4c6-7e08-4474-a285-3208198ce6fd}"){continue;}    // Ignore Fx default theme
  1417.     // Get info for item
  1418.         var thisExt = new febeExtInfo(extGUID);
  1419.         if(!thisExt) continue;
  1420.         var eType = thisExt.type;                            // 2=Extension, 4=Theme
  1421.         if(eType != 2 && eType != 4){continue;}                // Not an extension or theme ... what is it?
  1422.         if(eType == 2 && buExtensions == false){
  1423.             continue;  // Not backing up extensions at this time
  1424.         }else{
  1425.             exBackedUp = true;
  1426.         }//if
  1427.         if(eType == 4 && buThemes == false){
  1428.             continue;  // Not backing up themes at this time
  1429.         }else{
  1430.             thBackedUp = true;
  1431.         }//if
  1432.  
  1433.         var extIsDisabled = thisExt.isDisabled;
  1434.         if(ignoreDisabled == true){
  1435.             if(extIsDisabled != false){
  1436.                 febeDisabledCount++;
  1437.                 continue;
  1438.             }//if
  1439.         }//if    
  1440.         var extName = thisExt.name;
  1441.         febeObserverService.notify(null,"buItem",extName);
  1442.         
  1443.         var extVer = febeStripSpaces(thisExt.version);
  1444.         var extIcon = thisExt.iconURL;
  1445.         if(extIsDisabled){extIcon = "chrome://febe/skin/disabled.png";}
  1446.         var extHome = thisExt.homepageURL;
  1447.  
  1448.         febeExtExt = ".xpi";
  1449.         if(eType == 4){febeExtExt = ".jar"};
  1450.         var extBuName = febeStripSpaces(extName)+"{" + extVer + "}"+febeExtExt;
  1451.         if(type == "global") extBuName += " "+febeMsg[257];
  1452.         var srcName = extDir.clone();
  1453.         srcName.append(extGUID);
  1454.         srcName = srcName.path;
  1455.         
  1456.         febeZip(srcName,febeExBuDir,extBuName,false,false);
  1457.         if(extGUID == FEBE_GUID){febeFEBEbackedUp = true;}
  1458.         
  1459.         var item = new febeExtObj;
  1460.         item.Name = extBuName;
  1461.         item.Path = "";
  1462.         item.Icon = febeConvertToDataUrl(extIcon);
  1463.         item.Home = extHome;
  1464.         item.guid = extGUID;
  1465.         item.Type = eType;
  1466.         item.verified = febeVerify(extBuName);
  1467.         
  1468.         if(eType == 2){
  1469.             febeExtensionsList[item.Name] = item;
  1470.             febeExtensionsList["**total**"]++;    
  1471.         }else{
  1472.             febeThemesList[item.Name] = item;
  1473.             febeThemesList["**total**"]++;
  1474.         }//if
  1475.     }//while
  1476.     return true;
  1477. }//febeBackupExtensions() 
  1478.  
  1479. function febeBackupBookmarksJSON(){
  1480.     bmBackedUpJSON = false;
  1481.     if (!buBookmarksJSON){return true;}
  1482.     bmBuNameJSON ="bookmarks{" + febeProfName  + "}.json";
  1483.     var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1484.     dFile.initWithPath(febeExBuDir);
  1485.     dFile.append(bmBuNameJSON);
  1486.     PlacesUtils.backupBookmarksToFile(dFile);
  1487.     bmBackedUpJSON = febeVerify(bmBuNameJSON);
  1488.     return true;
  1489. }//febeBackupBookmarks()
  1490.  
  1491. function febeBackupBookmarksHTML(){
  1492.     bmBackedUpHTML = false;
  1493.     if (!buBookmarksHTML){return true;}
  1494.     bmBuNameHTML ="bookmarks{" + febeProfName  + "}.html";
  1495.     var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1496.     dFile.initWithPath(febeExBuDir);
  1497.     dFile.append(bmBuNameHTML);
  1498.     var exporter = Cc["@mozilla.org/browser/places/import-export-service;1"]
  1499.     .getService(Ci.nsIPlacesImportExportService);
  1500.     exporter.exportHTMLToFile(dFile);
  1501.     bmBackedUpHTML = febeVerify(bmBuNameHTML);
  1502.     return true;
  1503. }//febeBackupBookmarksHTML()
  1504.  
  1505. function febeBackupPreferences(){
  1506.     prBackedUp = false;
  1507.     if (!buPreferences){return true;}
  1508.     var profileDir = febeProfDir.clone();
  1509.     profileDir.append("prefs.js");
  1510.     var srcFile = profileDir.path
  1511.     prBuName ="prefs{" + febeProfName  + "}.js";
  1512.     if (febeCopyFile(srcFile,febeExBuDir,prBuName)){prBackedUp = febeVerify(prBuName);}
  1513.     return true;
  1514. }//febeBackupPreferences()
  1515.  
  1516. function febeBackupCookies(){
  1517.     ckBackedUp = false;
  1518.     if (!buCookies){return true;}
  1519.     ckBuName ="cookies{" + febeProfName  + "}.json";
  1520.     var dFile, fos, cos;
  1521.     var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
  1522.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1523.                     
  1524.     dFile = febeBuDesDir.clone();
  1525.     dFile.append(ckBuName);
  1526.     
  1527.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1528.     fos.init(dFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1529.     
  1530.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1531.     cos.init(fos, "UTF-8", 0, 0x0000);
  1532.     
  1533.     var cnt = 0;    
  1534.     var iter = cookieManager.enumerator;
  1535.     while (iter.hasMoreElements()){
  1536.         var cookie = iter.getNext();
  1537.         if (cookie instanceof Ci.nsICookie){
  1538.             var cookieObj = new febeCookieObj(
  1539.                 cookie.expires,
  1540.                 cookie.host,
  1541.                 cookie.isDomain,
  1542.                 cookie.isSecure,
  1543.                 cookie.name,
  1544.                 cookie.path,
  1545.                 cookie.policy,
  1546.                 cookie.status,
  1547.                 cookie.value);
  1548.                 
  1549.             cookieObj.expires = cookie.expires * 1000;  // Convert seconds to milliseconds
  1550.             var jstr = JSON.encode(cookieObj);
  1551.             cos.writeString(jstr+"\n"); 
  1552.             cnt++;
  1553.         }//if
  1554.     }//while
  1555.     cos.close();
  1556.     fos.close();
  1557.     ckBackedUp = febeVerify(ckBuName);
  1558.     return true;
  1559. }//febeBackupCookies()
  1560.  
  1561. function febeBackupUserChrome(){
  1562.     chBackedUp = false;
  1563.     if (!buUserChrome){return true;}
  1564.     var profileDir = febeProfDir.clone();
  1565.     profileDir.append("chrome");
  1566.     if (!profileDir.exists()){return true;}
  1567.     var srcDir = profileDir.path;
  1568.     chBuName ="userChrome{" + febeProfName  + "}.fbu";
  1569.     febeZip(srcDir,febeExBuDir,chBuName,false,false);
  1570.     chBackedUp = febeVerify(chBuName);
  1571.     return true;
  1572. }//febeBackupUserChrome()
  1573.  
  1574. function febeBackupPasswords(){
  1575.     pwBackedUp = false;
  1576.     if (!buUserPwd){return true;}
  1577.     pwBuName = "usernames-passwords{" + febeDosHappy(febeProfName)  + "}.json";
  1578.     
  1579.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1580.     var hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField
  1581.     var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
  1582.     var dFile, fos, cos;
  1583.     
  1584.     dFile = febeBuDesDir.clone();
  1585.     dFile.append(pwBuName)
  1586.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1587.     fos.init(dFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1588.     
  1589.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1590.     cos.init(fos, "UTF-8", 0, 0x0000);
  1591.     
  1592.     var logins = loginManager.getAllLogins({});
  1593.     for (var i = 0; i < logins.length; i++) {
  1594.         login = {};
  1595.         login.hostname = logins[i].hostname;
  1596.         login.formSubmitURL = logins[i].formSubmitURL;
  1597.         login.httpRealm = logins[i].httpRealm;
  1598.         login.username = logins[i].username;
  1599.         login.usernameField = logins[i].usernameField;
  1600.         login.password = febeObfuscate(true,logins[i].password); 
  1601.         login.passwordField = logins[i].passwordField;
  1602.         var jstr = JSON.encode(login);
  1603.         cos.writeString(jstr+"\n"); 
  1604.     }//for
  1605.     
  1606.     cos.close();
  1607.     fos.close();
  1608.     pwBackedUp = febeVerify(pwBuName);
  1609.     return true;
  1610. }//febeBackupPasswords()
  1611.  
  1612. function febeBackupSearchPlugins(){
  1613.     spBackedUp = false;
  1614.     if (!buSearchPlugins){return true;}
  1615.     
  1616.   // See if search plugins exist
  1617.     var profileDir = febeProfDir.clone();
  1618.     profileDir.append("searchplugins");
  1619.     if (!(profileDir.exists() && profileDir.isDirectory())){return true;}
  1620.     spBuName = "searchPlugins{" + febeDosHappy(febeProfName)  + "}.fbu";
  1621.     var srcName = febeProfDir.clone();
  1622.     srcName.append("searchplugins");
  1623.     srcName = srcName.path;
  1624.     febeZip(srcName,febeExBuDir,spBuName,false,false);
  1625.     spBackedUp = febeVerify(spBuName);
  1626.     return true;
  1627. }//febeBackupSearchPlugins()
  1628.  
  1629. function febeBackupBrowserHistory(){
  1630.     hsBackedUp = false;
  1631.     if (!buBrowserHistory){return true;}
  1632.     hsBuName ="history{" + febeProfName  + "}.json";
  1633.     var dFile, fos, cos;
  1634.     var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
  1635.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1636.                     
  1637.     dFile = febeBuDesDir.clone();
  1638.     dFile.append(hsBuName);
  1639.     
  1640.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1641.     fos.init(dFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1642.     
  1643.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1644.     cos.init(fos, "UTF-8", 0, 0x0000);
  1645.     
  1646.     // Get all history entries
  1647.     var options = historyService.getNewQueryOptions();
  1648.     var query = historyService.getNewQuery();
  1649.     var result = historyService.executeQuery(query, options); 
  1650.  
  1651.     var rr = result.root;
  1652.     rr.containerOpen = true;
  1653.     cnt = 0;
  1654.  
  1655.     for (var i = 0; i < rr.childCount; ++i) {
  1656.         var childNode = rr.getChild(i);
  1657.         var type = childNode.type;
  1658.         if(type != rr.RESULT_TYPE_URI) continue;
  1659.         var obj = {aURI : childNode.uri, aTitle : childNode.title, aLastVisited : childNode.time};
  1660.         var jstr = JSON.encode(obj);
  1661.         cos.writeString(jstr+"\n"); 
  1662.         cnt++;
  1663.     }//for
  1664.     
  1665.     cos.close();
  1666.     fos.close();
  1667.     hsBackedUp = febeVerify(hsBuName);
  1668.     return true;
  1669. }//febeBackupBrowserHistory()
  1670.  
  1671. function febeBackupFormFillHistory(){
  1672.     ffBackedUp = false;
  1673.     if (!buFormFillHistory){return true;}
  1674.     ffBuName ="ffhistory{" + febeProfName  + "}.json";
  1675.     var dFile, fos, cos;
  1676.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1677.                     
  1678.     outFile = febeBuDesDir.clone();
  1679.     outFile.append(ffBuName);
  1680.     var dbFile = febeProfDir.clone();
  1681.     dbFile.append("formhistory.sqlite");
  1682.  
  1683.     var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  1684.     var db = storageService.openDatabase(dbFile);
  1685.  
  1686.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1687.     fos.init(outFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1688.     
  1689.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1690.     cos.init(fos, "UTF-8", 0, 0x0000);
  1691.  
  1692.     var cnt = 0;        
  1693.     var sQuery = "SELECT * FROM moz_formhistory";
  1694.     var stmt = db.createStatement(sQuery);
  1695.     while (stmt.executeStep()) {
  1696.         var obj = {id : stmt.getString(0), fieldname : stmt.getString(1), value : stmt.getString(2)};
  1697.         var jstr = JSON.encode(obj);
  1698.         cos.writeString(jstr+"\n"); 
  1699.         cnt++;
  1700.     }//while
  1701.     cos.close();
  1702.     fos.close();
  1703.     ffBackedUp = febeVerify(ffBuName);
  1704.     return true;
  1705. }//febeBackupFormFillHistory()
  1706.  
  1707. function febeBackupPermissions(){
  1708.     pmBackedUp = false;
  1709.     if (!buPermissions){return true;}
  1710.     pmBuName ="permissions{" + febeProfName  + "}.json";
  1711.     var dFile, fos, cos;
  1712.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1713.     
  1714.     outFile = febeBuDesDir.clone();
  1715.     outFile.append(pmBuName);
  1716.     var dbFile = febeProfDir.clone();
  1717.     dbFile.append("permissions.sqlite");
  1718.  
  1719.     var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  1720.     var db = storageService.openDatabase(dbFile);
  1721.  
  1722.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1723.     fos.init(outFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1724.     
  1725.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1726.     cos.init(fos, "UTF-8", 0, 0x0000);
  1727.  
  1728.     var cnt = 0;        
  1729.     var sQuery = "SELECT * FROM moz_hosts";
  1730.     var stmt = db.createStatement(sQuery);
  1731.     while (stmt.executeStep()) {
  1732.         var obj = {id : stmt.getString(0), host : stmt.getString(1), type : stmt.getString(2), permission : stmt.getString(3)};
  1733.         var jstr = JSON.encode(obj);
  1734.         cos.writeString(jstr+"\n"); 
  1735.         cnt++;
  1736.     }//while
  1737.     cos.close();
  1738.     fos.close();
  1739.     pmBackedUp = febeVerify(pmBuName);
  1740.     return true;
  1741. }//febeBackupPermissions()
  1742.  
  1743. function febeBackupUDBu(){
  1744.     if (!buUDBu){return true;}
  1745.     udBackedUp = 0;
  1746.     febeUDBuDone = [];
  1747.     if(!febeUDBuInit()){return false;}    // UDBU is empty
  1748.     for(var i in febeUDBuList){
  1749.         var Label = new String(febeUDBuList[i].Label);
  1750.         if(Label.length == 0){continue;}    // Datafile is empty?
  1751.         var Type = new Number(febeUDBuList[i].Type);
  1752.         var Description = new String(febeUDBuList[i].Description);
  1753.         var Path = new String(febeUDBuList[i].Path);
  1754.         var Include = Boolean(false);
  1755.         Include = febeUDBuList[i].Include;
  1756.         var item = new febeUDBuDoneObj;
  1757.         item.Description = Description;
  1758.         item.Type = Type;    // Not really needed ... just for completeness    
  1759.         if(Include == "false"){continue;}
  1760.         if(Type == 1){    // Folder
  1761.             udBuName = Label+"{" + febeDosHappy(febeProfName)  + "}.fbu";
  1762.             var srcName = Path;
  1763.             item.Name = udBuName;
  1764.             febeZip(srcName,febeExBuDir,udBuName,true,false);
  1765.             
  1766.             if(febeVerify(udBuName)){        
  1767.                 udBackedUp++;
  1768.             }else{
  1769.                 item.Description = "*** Error backing up "+Description;
  1770.             }//if
  1771.  
  1772.             febeUDBuDone[Label] = item;
  1773.             
  1774.         }else{        // File
  1775.             var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1776.             file.initWithPath(Path);
  1777.             var UDBuName = Label+"{"+febeProfName+"}-"+file.leafName;
  1778.             item.Name = UDBuName;
  1779.             
  1780.             if(file.exists()){
  1781.                 febeCopyFile(Path,febeExBuDir,UDBuName);    
  1782.             }else{
  1783.                 var style = "<style>color: red;font-size: 12pt;</style>";
  1784.                 var tmp = style+febeMsg[166].replace("%path%",Path)+"\n"
  1785.                 febeAlert(tmp);
  1786.             }//if
  1787.             
  1788.             if(febeVerify(UDBuName)){        
  1789.                 udBackedUp++;
  1790.             }else{
  1791.                 item.Description = febeMsg[167].replace("%description%",Description);
  1792.             }//if
  1793.             febeUDBuDone[Label] = item;
  1794.         }//if
  1795.     }//for    
  1796.     return true;
  1797. }//febeBackupUDbu()
  1798.  
  1799. function febeBackupProfile(){
  1800.     upBackedUp = false;
  1801.     upBuName = "profileFx3{" + febeProfName  + "}.fbu"; 
  1802.     var srcName = febeProfDir.clone();
  1803.     srcName = srcName.path;
  1804.     febeZip(srcName,febeExBuDir,upBuName,false,false);
  1805.     upBackedUp = febeVerify(upBuName);
  1806.     return true;
  1807. }//febeBackupProfile()
  1808.  
  1809. // ------------------ End of Backup Functions -------------
  1810.  
  1811. // ------------------ Restore Functions -------------------
  1812.  
  1813. function febeRestoreOnlineBackup(which){
  1814.     if(!febeInitDir()){return false;}    
  1815.     Application.storage.set("type", which);
  1816.     window.openDialog("chrome://febe/content/BoxRestore.xul", "FEBE Online Restore", "chrome,modal=yes,dialog=yes,centerscreen,resizable",febeMsg);    
  1817.     var abort = Application.storage.get("abort", false);
  1818.     if(abort){return false;}
  1819.     
  1820.     febeLocalizedStr["current"] = febeLocalizedStr[which]
  1821.     switch(which){
  1822.         case "bookmarksJSON":
  1823.             febeRestoreBookmarksOnlineJSON();
  1824.             break;
  1825.         case "bookmarksHTML":
  1826.             febeRestoreBookmarksOnlineHTML();
  1827.             break;
  1828.         case "preferences":
  1829.             febeRestorePreferencesOnline();
  1830.             break;
  1831.         case "cookies":
  1832.             febeRestoreCookiesOnline();
  1833.             break;
  1834.         case "userChrome":
  1835.             febeRestoreUserChromeOnline();
  1836.             break;
  1837.         case "usernames-passwords":
  1838.             febeRestorePasswordsOnline();
  1839.             break;
  1840.         case "searchPlugins":
  1841.             febeRestoreSearchPluginsOnline();
  1842.             break;
  1843.         case "history":
  1844.             febeRestoreBrowserHistoryOnline();
  1845.             break;
  1846.         case "ffhistory":
  1847.             febeRestoreFormFillHistoryOnline();
  1848.             break;
  1849.         case "permissions":
  1850.             febeRestorePermissionsOnline();
  1851.             break;
  1852.         case "userDefined":
  1853.             febeRestoreUDBUOnline();
  1854.             break;
  1855.         case "profile":
  1856.             febeGetProfileBackup("online");
  1857.             break;
  1858.     }//switch
  1859.     var d = document.getElementById("febestatusbarprogress");
  1860.     if(d){    
  1861.         d.removeAttribute("label");
  1862.         d.setAttribute("hidden","true");
  1863.     }//if
  1864.     return true;
  1865. }//febeRestoreOnlineBackup()
  1866.  
  1867. function febeRestoreExtensions(){
  1868.     if(!febeInitDir()){return false;}
  1869.     febePickFiles("*.xpi",25);
  1870.     
  1871.     var xpi = new Array();
  1872.     for (var i = 0; i < febeETinstall.length; i++){    
  1873.         var tmp = "file:///" + escape(febeETinstall[i].Path);
  1874.         var name = febeETinstall[i].Name;
  1875.         xpi[name]=tmp;    
  1876.     }//for
  1877.     InstallTrigger.install(xpi);
  1878.     return true;
  1879. }//febeRestoreExtensions()
  1880.  
  1881. function febeRestoreExtensionsOnline(){
  1882.     Application.storage.set("type", "extension");
  1883.     febeWin = window.openDialog("chrome://febe/content/BoxRestore.xul", "FEBE", "chrome,dialog=yes,centerscreen,resizable",febeMsg);    
  1884.     return true;
  1885. }//febeRestoreExtensions(Online)
  1886.  
  1887. function febeRestoreThemes(){
  1888.     if(!febeInitDir()){return false;}
  1889.     febePickFiles("*.jar",24);
  1890.     
  1891.     var jar = new Array();
  1892.     for (var i = 0; i < febeETinstall.length; i++){    
  1893.         var tmp = "file:///" + febeETinstall[i].Path;
  1894.         var name = febeETinstall[i].Name;
  1895.         jar[name]=tmp;    
  1896.     }//for
  1897.     InstallTrigger.install(jar);
  1898.     return true;
  1899. }//febeRestoreThemes()
  1900.  
  1901. function febeRestoreThemesOnline(){
  1902.     Application.storage.set("type", "theme");
  1903.     febeWin = window.openDialog("chrome://febe/content/BoxRestore.xul", "FEBE", "chrome,dialog=yes,centerscreen,resizable",febeMsg);    
  1904.     return true;
  1905. }//febeRestoreThemes(Online)
  1906.  
  1907. function febeRestoreBookmarksJSON(){
  1908.     if(!febeInitDir()){return false;}
  1909.     febePathName = ""
  1910.     if(!febePickFile("bookmarks*.json",33)){return true};
  1911.     var check1 = febePrName.indexOf("bookmarks{");
  1912.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  1913.     if(check1 != 0 || check2 != 6){
  1914.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[50].replace("%FILE%","'"+febePrName+"'")+"\n";
  1915.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1916.         febeAlert(tmp);
  1917.         return false;
  1918.     }//if
  1919.     
  1920.     febeBUdate = febeGetBuDate(febePathName);
  1921.     if(febeConfirmRestore(37,febeBUdate)){
  1922.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1923.         dFile.initWithPath(febePathName);
  1924.         PlacesUtils.restoreBookmarksFromJSONFile(dFile);
  1925.         febeAlert(febeMsg[42]);
  1926.     }else{
  1927.         febeAlert(febeMsg[46]);
  1928.     }
  1929.     return true;
  1930. }//febeRestoreBookmarks()
  1931.  
  1932. function febeRestoreBookmarksOnlineJSON(){
  1933.     var date = Application.storage.get("created", "");
  1934.     var name = Application.storage.get("name", "");
  1935.     febePathName = Application.storage.get("location", "");
  1936.     febeBUdate = new Date(parseInt(date));
  1937.  
  1938.     if(febeConfirmRestore(37,febeBUdate)){
  1939.         febeSetStatusbarMsg();
  1940.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1941.         dFile.initWithPath(febePathName);
  1942.         PlacesUtils.restoreBookmarksFromJSONFile(dFile);
  1943.         febeAlert(febeMsg[42]);
  1944.     }else{
  1945.         febeAlert(febeMsg[46]);
  1946.     }
  1947.     return true;
  1948. }//febeRestoreBookmarks(Online)
  1949.  
  1950. function febeRestoreBookmarksHTML(){
  1951.     if(!febeInitDir()){return false;}
  1952.     febePathName = ""
  1953.     if(!febePickFile("bookmarks*.html",33)){return true};
  1954.     var check1 = febePrName.indexOf("bookmarks{");
  1955.     var check2 = febePrName.length - febePrName.lastIndexOf("}.html");
  1956.     if(check1 != 0 || check2 != 6){
  1957.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[50].replace("%FILE%","'"+febePrName+"'")+"\n";
  1958.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1959.         febeAlert(tmp);
  1960.         return false;
  1961.     }//if
  1962.     
  1963.     febeBUdate = febeGetBuDate(febePathName);
  1964.     if(febeConfirmRestore(37,febeBUdate)){
  1965.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1966.         dFile.initWithPath(febePathName);
  1967.         var importer = Cc["@mozilla.org/browser/places/import-export-service;1"]
  1968.         .getService(Ci.nsIPlacesImportExportService);
  1969.         importer.importHTMLFromFile(dFile, true);
  1970.         febeAlert(febeMsg[42]);
  1971.     }else{
  1972.         febeAlert(febeMsg[46]);
  1973.     }
  1974.     return true;
  1975. }//febeRestoreBookmarksHTML()
  1976.  
  1977. function febeRestoreBookmarksOnlineHTML(){
  1978.     var date = Application.storage.get("created", "");
  1979.     var name = Application.storage.get("name", "");
  1980.     febePathName = Application.storage.get("location", "");
  1981.     febeBUdate = new Date(parseInt(date));
  1982.  
  1983.     if(febeConfirmRestore(37,febeBUdate)){
  1984.         febeSetStatusbarMsg();
  1985.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1986.         dFile.initWithPath(febePathName);
  1987.         var importer = Cc["@mozilla.org/browser/places/import-export-service;1"]
  1988.         .getService(Ci.nsIPlacesImportExportService);
  1989.         importer.importHTMLFromFile(dFile, true);
  1990.         febeAlert(febeMsg[42]);
  1991.     }else{
  1992.         febeAlert(febeMsg[46]);
  1993.     }
  1994.     return true;
  1995. }//febeRestoreBookmarksOnlineHTML()
  1996.  
  1997. function febeRestorePreferences(){
  1998.     if(!febeInitDir()){return false;}
  1999.     febePathName = ""
  2000.     if(!febePickFile("prefs*.js",34)){return true};
  2001.     var check1 = febePrName.indexOf("prefs{");
  2002.     var check2 = febePrName.length - febePrName.lastIndexOf("}.js");
  2003.     if(check1 != 0 || check2 != 4){
  2004.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[69].replace("%FILE%","'"+febePrName+"'")+"\n";
  2005.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2006.         febeAlert(tmp);
  2007.         return false;
  2008.     }//if
  2009.  
  2010.     febeBUdate = febeGetBuDate(febePathName);
  2011.     if(febeConfirmRestore(38,febeBUdate)){
  2012.         
  2013.         // Pointer to preferences
  2014.         var oldPrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
  2015.         
  2016.         // Pointer to new (restored) preferences
  2017.         var newPrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  2018.                     
  2019.         // Pointer to backed up preferences file
  2020.         var newPrefFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2021.         
  2022.         // Get pointer to "Prefs.js"
  2023.         var PrefsFile = febeProfDir.clone();
  2024.                    
  2025.         PrefsFile.append("prefs.js")
  2026.         newPrefFile.initWithPath(febePathName);     // Initialize backed up prefs file
  2027.         oldPrefs.deleteBranch("");                    // Delete old preferences
  2028.         newPrefs.readUserPrefs(newPrefFile);        // Read in backed up preferences
  2029.         newPrefs.savePrefFile(PrefsFile);            // Save the restored preferences file
  2030.         febeAlert(febeMsg[43]);
  2031.         febeRestartFx();                            // Restart Firefox
  2032.     }else{
  2033.         febeAlert(febeMsg[46]);
  2034.     }
  2035.     return true;
  2036. }//febeRestorePreferences()
  2037.  
  2038. function febeRestorePreferencesOnline(){
  2039.     var date = Application.storage.get("created", "");
  2040.     var name = Application.storage.get("name", "");
  2041.     febePathName = Application.storage.get("location", "");
  2042.     febeBUdate = new Date(parseInt(date));
  2043.     if(febeConfirmRestore(38,febeBUdate)){
  2044.         febeSetStatusbarMsg();
  2045.         // Pointer to preferences
  2046.         var oldPrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
  2047.         
  2048.         // Pointer to new (restored) preferences
  2049.         var newPrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  2050.                     
  2051.         // Pointer to backed up preferences file
  2052.         var newPrefFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2053.         
  2054.         // Get pointer to "Prefs.js"
  2055.         var PrefsFile = febeProfDir.clone();
  2056.                    
  2057.         PrefsFile.append("prefs.js")
  2058.         newPrefFile.initWithPath(febePathName);     // Initialize backed up prefs file
  2059.         oldPrefs.deleteBranch("");                    // Delete old preferences
  2060.         newPrefs.readUserPrefs(newPrefFile);        // Read in backed up preferences
  2061.         newPrefs.savePrefFile(PrefsFile);            // Save the restored preferences file
  2062.         febeAlert(febeMsg[43]);
  2063.         febeRestartFx();                            // Restart Firefox
  2064.     }else{
  2065.         febeAlert(febeMsg[46]);
  2066.     }
  2067.     return true;
  2068. }//febeRestorePreferencesOnline()
  2069.  
  2070. function febeRestoreCookies(){
  2071.     if(!febeInitDir()){return false;}
  2072.     febePathName = ""
  2073.     if(!febePickFile("cookies*.json",35)){return true};            
  2074.     var check1 = febePrName.indexOf("cookies{");
  2075.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  2076.     if(check1 != 0 || check2 != 6){
  2077.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[71].replace("%FILE%","'"+febePrName+"'")+"\n";
  2078.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2079.         febeAlert(tmp);
  2080.         return false;
  2081.     }//if
  2082.  
  2083.     febeBUdate = febeGetBuDate(febePathName);
  2084.     if(febeConfirmRestore(39,febeBUdate)){
  2085.  
  2086.         Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager).removeAll();
  2087.         
  2088.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2089.  
  2090.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2091.         var cookieSvc = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService);
  2092.  
  2093.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2094.         dFile.initWithPath(febePathName);
  2095.         
  2096.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2097.         fis.init(dFile, 0x01, 0444, 0);
  2098.         fis.QueryInterface(Ci.nsILineInputStream);
  2099.  
  2100.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2101.         cis.init(fis,"UTF-8", 0, 0x0000);
  2102.         
  2103.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2104.  
  2105.         // read lines into array and parse into individual fields
  2106.         var line = {}, hasmore;    
  2107.         var cnt = 0;
  2108.         do {
  2109.             hasmore = lis.readLine(line);
  2110.             var cookie = JSON.decode(line.value)
  2111.             var url = "http" + ((cookie.isSecure)?"s":"") + "://" + cookie.host + (cookie.path || "").replace(/^(?!\/)/, "/");
  2112.             var cookieUri = ios.newURI(url, null, null);
  2113.             var dt = new Date()
  2114.             dt.setTime(cookie.expires)
  2115.             var str = cookie.name+"="+cookie.value+";domain="+cookie.host+";expires="+dt.toUTCString();
  2116.             cookieSvc.setCookieString(cookieUri, null, str, null);
  2117.             //document.cookie = unescape(str);    // Commit the cookie
  2118.             cnt++;
  2119.         } while(hasmore);
  2120.         febeAlert(febeMsg[44]);
  2121.     }else{
  2122.         febeAlert(febeMsg[46]);
  2123.     }//if
  2124.     cis.close();
  2125.     fis.close();
  2126.     return true;
  2127. }//febeRestoreCookies()
  2128.  
  2129. function febeRestoreCookiesOnline(){
  2130.     var date = Application.storage.get("created", "");
  2131.     var name = Application.storage.get("name", "");
  2132.     febePathName = Application.storage.get("location", "");
  2133.     febeBUdate = new Date(parseInt(date));
  2134.  
  2135.     if(febeConfirmRestore(39,febeBUdate)){
  2136.         febeSetStatusbarMsg();
  2137.         Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager).removeAll();
  2138.         
  2139.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2140.  
  2141.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2142.         var cookieSvc = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService);
  2143.  
  2144.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2145.         dFile.initWithPath(febePathName);
  2146.         
  2147.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2148.         fis.init(dFile, 0x01, 0444, 0);
  2149.         fis.QueryInterface(Ci.nsILineInputStream);
  2150.  
  2151.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2152.         cis.init(fis,"UTF-8", 0, 0x0000);
  2153.         
  2154.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2155.  
  2156.         // read lines into array and parse into individual fields
  2157.         var line = {}, hasmore;    
  2158.         var cnt = 0;
  2159.         do {
  2160.             hasmore = lis.readLine(line);
  2161.             var cookie = JSON.decode(line.value)
  2162.             var url = "http" + ((cookie.isSecure)?"s":"") + "://" + cookie.host + (cookie.path || "").replace(/^(?!\/)/, "/");
  2163.             var cookieUri = ios.newURI(url, null, null);
  2164.             var dt = new Date()
  2165.             dt.setTime(cookie.expires)
  2166.             var str = cookie.name+"="+cookie.value+";domain="+cookie.host+";expires="+dt.toUTCString();
  2167.             cookieSvc.setCookieString(cookieUri, null, str, null);
  2168.             //document.cookie = unescape(str);    // Commit the cookie
  2169.             cnt++;
  2170.         } while(hasmore);
  2171.         febeAlert(febeMsg[44]);
  2172.     }else{
  2173.         febeAlert(febeMsg[46]);
  2174.     }//if
  2175.     cis.close();
  2176.     fis.close();
  2177.     return true;
  2178. }//febeRestoreCookiesOnline()
  2179.  
  2180. function febeRestoreUserChrome(){
  2181.     if(!febeInitDir()){return false;}
  2182.     febePathName = ""
  2183.     var chromeDir = febeProfDir.clone();
  2184.     chromeDir.append("chrome");
  2185.     if(!febePickFile("userChrome*.fbu",78)){return true};
  2186.     var check1 = febePrName.indexOf("userChrome{");
  2187.     var check2 = febePrName.length - febePrName.lastIndexOf("}.fbu");
  2188.     if(check1 != 0 || check2 != 5){
  2189.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[83].replace("%FILE%","'"+febePrName+"'")+"\n";
  2190.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2191.         febeAlert(tmp);
  2192.         return false;
  2193.     }//if
  2194.  
  2195.     febeBUdate = febeGetBuDate(febePathName);
  2196.     if(febeConfirmRestore(68,febeBUdate)){
  2197.         var sourceDir = febePfParent;
  2198.         var destDir = chromeDir.path;
  2199.         var zipName = febePfName;
  2200.         febeUnzip(sourceDir,destDir,zipName);
  2201.         febeChmod(destDir);
  2202.         febeAlert(febeMsg[79]);
  2203.     }else{
  2204.         febeAlert(febeMsg[46]);
  2205.     }
  2206.     return true;
  2207. }//febeRestoreUserChrome()
  2208.  
  2209. function febeRestoreUserChromeOnline(){
  2210.     var chromeDir = febeProfDir.clone();
  2211.     chromeDir.append("chrome");
  2212.     var destDir = chromeDir.path;
  2213.     var date = Application.storage.get("created", "");
  2214.     var zipName = Application.storage.get("name", "");
  2215.     febePathName = Application.storage.get("location", "");
  2216.     var sourceDir = Application.storage.get("parent", "");
  2217.     febeBUdate = new Date(parseInt(date));
  2218.  
  2219.     if(febeConfirmRestore(68,febeBUdate)){
  2220.         febeSetStatusbarMsg();
  2221.         febeUnzip(sourceDir,destDir,zipName);
  2222.         febeChmod(destDir);
  2223.         febeAlert(febeMsg[79]);
  2224.     }else{
  2225.         febeAlert(febeMsg[46]);
  2226.     }
  2227.     return true;
  2228. }//febeRestoreUserChromeOnline()
  2229.  
  2230. function febeRestorePasswords(){
  2231.     if(!febeInitDir()){return false;}
  2232.     febePathName = ""
  2233.     if(!febePickFile("usernames-passwords*.json",80)){return true};    
  2234.     var check1 = febePrName.indexOf("usernames-passwords{");
  2235.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  2236.     if(check1 != 0 || check2 != 6){
  2237.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[125].replace("%FILE%","'"+febePrName+"'")+"\n";
  2238.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2239.         febeAlert(tmp);
  2240.         return false;
  2241.     }//if
  2242.     
  2243.     febeBUdate = febeGetBuDate(febePathName);
  2244.  
  2245.     if(febeConfirmRestore(70,febeBUdate)){
  2246.  
  2247.         // Clear existing paswords
  2248.         var hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField
  2249.         var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
  2250.         var logins = loginManager.getAllLogins({}); 
  2251.         for (var i = 0; i < logins.length; i++) {
  2252.             //login = new nsLoginInfo(hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField);
  2253.             login = {};
  2254.             login.hostname = logins[i].hostname;
  2255.             login.formSubmitURL = logins[i].formSubmitURL;
  2256.             login.httpRealm = logins[i].httpRealm;
  2257.             login.username = logins[i].username;
  2258.             login.usernameField = logins[i].usernameField;
  2259.             login.password = logins[i].password; 
  2260.             login.passwordField = logins[i].passwordField;
  2261.             loginManager.removeLogin(login);
  2262.         }//for
  2263.         
  2264.         dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2265.         dFile.initWithPath(febePathName);
  2266.         
  2267.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2268.         fis.init(dFile, 0x01, 0444, 0);
  2269.         fis.QueryInterface(Ci.nsILineInputStream);
  2270.  
  2271.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2272.  
  2273.         cis.init(fis,"UTF-8", 0, 0x0000);
  2274.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2275.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2276.         var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",Ci.nsILoginInfo,"init");
  2277.  
  2278.         var line = {}, hasmore;    
  2279.         var cnt = 0;
  2280.         do {
  2281.             hasmore = lis.readLine(line);
  2282.             var data = JSON.decode(line.value)
  2283.             login = new nsLoginInfo(hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField);
  2284.             login.hostname = data.hostname;
  2285.             login.formSubmitURL = data.formSubmitURL;
  2286.             login.httpRealm = data.httpRealm;
  2287.             login.username = data.username;
  2288.             login.usernameField = data.usernameField;
  2289.             login.password = febeObfuscate(false,data.password);
  2290.             login.passwordField = data.passwordField;
  2291.             try{
  2292.                 loginManager.addLogin(login);
  2293.                 cnt++;
  2294.             }catch(e){
  2295.                 var err = e;
  2296.                 var tmp = "<style>color: red; font-weight: bold; font-size: 10px;</style>"+err+"\n";
  2297.                 tmp += "Host: "+login.hostname+"\n"
  2298.                 tmp += "Username: "+login.username+"\n\n";
  2299.                 tmp += "<style>color: black; font-weight: bold; font-size: 12px;</style>"
  2300.                 tmp += "Login entry skipped";
  2301.                 febeAlert(tmp);
  2302.             }
  2303.         } while(hasmore);
  2304.         febeAlert(febeMsg[81]);
  2305.     }else{
  2306.         febeAlert(febeMsg[46]);
  2307.     }//if
  2308.     cis.close();
  2309.     fis.close();
  2310.     return true;
  2311. }//febeRestorePasswords()
  2312.  
  2313. function febeRestorePasswordsOnline(){
  2314.     var date = Application.storage.get("created", "");
  2315.     febePathName = Application.storage.get("location", "");
  2316.     febeBUdate = new Date(parseInt(date));
  2317.  
  2318.     if(febeConfirmRestore(70,febeBUdate)){
  2319.         febeSetStatusbarMsg();
  2320.         // Clear existing paswords
  2321.         var hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField
  2322.         var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
  2323.         var logins = loginManager.getAllLogins({}); 
  2324.         for (var i = 0; i < logins.length; i++) {
  2325.             login = {};
  2326.             login.hostname = logins[i].hostname;
  2327.             login.formSubmitURL = logins[i].formSubmitURL;
  2328.             login.httpRealm = logins[i].httpRealm;
  2329.             login.username = logins[i].username;
  2330.             login.usernameField = logins[i].usernameField;
  2331.             login.password = logins[i].password; 
  2332.             login.passwordField = logins[i].passwordField;
  2333.             loginManager.removeLogin(login);
  2334.         }//for
  2335.         
  2336.         dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2337.         dFile.initWithPath(febePathName);
  2338.         
  2339.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2340.         fis.init(dFile, 0x01, 0444, 0);
  2341.         fis.QueryInterface(Ci.nsILineInputStream);
  2342.  
  2343.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2344.  
  2345.         cis.init(fis,"UTF-8", 0, 0x0000);
  2346.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2347.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2348.         var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",Ci.nsILoginInfo,"init");
  2349.  
  2350.         var line = {}, hasmore;    
  2351.         var cnt = 0;
  2352.         do {
  2353.             hasmore = lis.readLine(line);
  2354.             var data = JSON.decode(line.value)
  2355.             login = new nsLoginInfo(hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField);
  2356.             login.hostname = data.hostname;
  2357.             login.formSubmitURL = data.formSubmitURL;
  2358.             login.httpRealm = data.httpRealm;
  2359.             login.username = data.username;
  2360.             login.usernameField = data.usernameField;
  2361.             login.password = febeObfuscate(false,data.password);
  2362.             login.passwordField = data.passwordField;
  2363.             try{
  2364.                 loginManager.addLogin(login);
  2365.                 cnt++;
  2366.             }catch(e){
  2367.                 var err = e;
  2368.                 var tmp = "<style>color: red; font-weight: bold; font-size: 10px;</style>"+err+"\n";
  2369.                 tmp += "Host: "+login.hostname+"\n"
  2370.                 tmp += "Username: "+login.username+"\n\n";
  2371.                 tmp += "<style>color: black; font-weight: bold; font-size: 12px;</style>"
  2372.                 tmp += "Login entry skipped";
  2373.                 febeAlert(tmp);
  2374.             }
  2375.         } while(hasmore);
  2376.         febeAlert(febeMsg[81]);
  2377.     }else{
  2378.         febeAlert(febeMsg[46]);
  2379.     }//if
  2380.     cis.close();
  2381.     fis.close();
  2382.     return true;
  2383. }//febeRestorePasswordsOnline()
  2384.  
  2385. function febeRestoreSearchPlugins(){
  2386.     if(!febeInitDir()){return false;}
  2387.     febePathName = ""
  2388.     if(!febePickFile("searchPlugins*.fbu",84)){return true};
  2389.     var check1 = febePrName.indexOf("searchPlugins{");
  2390.     var check2 = febePrName.length - febePrName.lastIndexOf("}.fbu");
  2391.     if(check1 != 0 || check2 != 5){
  2392.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[55].replace("%FILE%","'"+febePrName+"'")+"\n";
  2393.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2394.         febeAlert(tmp);
  2395.         return false;
  2396.     }//if
  2397.  
  2398.     febeBUdate = febeGetBuDate(febePathName);
  2399.     if(febeConfirmRestore(72,febeBUdate)){
  2400.         var profileDir = febeProfDir.clone();
  2401.         profileDir.append("searchplugins");
  2402.         if (!(profileDir.exists() && profileDir.isDirectory())){
  2403.             // Create firedctory
  2404.             profileDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
  2405.         }//if
  2406.         var zipFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2407.         zipFile.initWithPath(febePathName);
  2408.         
  2409.         var sourceDir = zipFile.parent.path;
  2410.         var destDir = profileDir.path;
  2411.         var zipName = zipFile.leafName
  2412.         febeUnzip(sourceDir,destDir,zipName);
  2413.         febeChmod(destDir);
  2414.         febeAlert(febeMsg[85]);
  2415.     }else{
  2416.         febeAlert(febeMsg[46]);
  2417.     }//if
  2418.     return true;
  2419. }//febeRestoreSearchPlugins()
  2420.  
  2421. function febeRestoreSearchPluginsOnline(){
  2422.     var date = Application.storage.get("created", "");
  2423.     var zipName = Application.storage.get("name", "");
  2424.     febePathName = Application.storage.get("location", "");
  2425.     febeBUdate = new Date(parseInt(date));
  2426.     if(febeConfirmRestore(72,febeBUdate)){
  2427.         febeSetStatusbarMsg();
  2428.         var profileDir = febeProfDir.clone();
  2429.         profileDir.append("searchplugins");
  2430.         if (!(profileDir.exists() && profileDir.isDirectory())){
  2431.             // Create firedctory
  2432.             profileDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
  2433.         }//if
  2434.         var zipFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2435.         zipFile.initWithPath(febePathName);
  2436.         
  2437.         var sourceDir = zipFile.parent.path;
  2438.         var destDir = profileDir.path;
  2439.         var zipName = zipFile.leafName
  2440.         febeUnzip(sourceDir,destDir,zipName);
  2441.         febeChmod(destDir);
  2442.         febeAlert(febeMsg[85]);
  2443.     }else{
  2444.         febeAlert(febeMsg[46]);
  2445.     }//if
  2446.     return true;
  2447. }//febeRestoreSearchPlugins(Online)
  2448.  
  2449. function febeRestoreBrowserHistory(){
  2450.     if(!febeInitDir()){return false;}
  2451.     febePathName = ""
  2452.     if(!febePickFile("history*.json",86)){return true};
  2453.     var check1 = febePrName.indexOf("history{");
  2454.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  2455.     if(check1 != 0 || check2 != 6){
  2456.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[63].replace("%FILE%","'"+febePrName+"'")+"\n";
  2457.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2458.         febeAlert(tmp);
  2459.         return false;
  2460.     }//if
  2461.  
  2462.     febeBUdate = febeGetBuDate(febePathName);
  2463.     if(febeConfirmRestore(73,febeBUdate)){
  2464.         
  2465.         // Delete current history
  2466.         var bh = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsIBrowserHistory);
  2467.         bh.removeAllPages();
  2468.         try {
  2469.           var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  2470.           os.notifyObservers(null, "browser:purge-session-history", "");
  2471.         }
  2472.         catch (e) { }
  2473.         
  2474.         // Clear last URL of the Open Web Location dialog
  2475.         var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2);
  2476.         try {
  2477.           prefs.clearUserPref("general.open_location.last_url");
  2478.         }
  2479.         catch (e) { }
  2480.  
  2481.         // Restore browser history
  2482.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2483.  
  2484.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2485.         var cookieSvc = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService);
  2486.  
  2487.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2488.         dFile.initWithPath(febePathName);
  2489.         
  2490.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2491.         fis.init(dFile, 0x01, 0444, 0);
  2492.         fis.QueryInterface(Ci.nsILineInputStream);
  2493.  
  2494.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2495.         cis.init(fis,"UTF-8", 0, 0x0000);
  2496.         
  2497.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2498.  
  2499.         // read lines into array and parse into individual fields
  2500.         var line = {}, hasmore;    
  2501.         var cnt = 0;
  2502.         do {
  2503.             hasmore = lis.readLine(line);
  2504.             var histObj = JSON.decode(line.value);
  2505.             // create an nsIURI 
  2506.             var uri = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI(histObj.aURI, null, null);
  2507.  
  2508.             try{
  2509.                 bh.addPageWithDetails(uri, histObj.aTitle, histObj.aLastVisited) 
  2510.             }catch(e){
  2511.                 var msg = "\n\naURI: "+histObj.aURI+"\naTitle: "+histObj.aTitle+"\naLastVisited: "+histObj.aLastVisited;
  2512.                 febeRestoreError(e, msg)
  2513.                 return false;
  2514.             }//try/catch
  2515.             cnt++;
  2516.         } while(hasmore);
  2517.         //febeWin.close();
  2518.         febeAlert(febeMsg[106]);
  2519.     }else{    
  2520.         //febeWin.close();
  2521.         febeAlert(febeMsg[46]);
  2522.     }//if
  2523.     cis.close();
  2524.     fis.close();
  2525.     return true;
  2526. }//febeRestoreBrowserHistory()
  2527.  
  2528. function febeRestoreBrowserHistoryOnline(){
  2529.     var date = Application.storage.get("created", "");
  2530.     febePathName = Application.storage.get("location", "");
  2531.     febeBUdate = new Date(parseInt(date));
  2532.     if(febeConfirmRestore(73,febeBUdate)){
  2533.         febeSetStatusbarMsg();
  2534.         // Delete current history
  2535.         var bh = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsIBrowserHistory);
  2536.         bh.removeAllPages();
  2537.         try {
  2538.           var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  2539.           os.notifyObservers(null, "browser:purge-session-history", "");
  2540.         }
  2541.         catch (e) { }
  2542.         
  2543.         // Clear last URL of the Open Web Location dialog
  2544.         var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2);
  2545.         try {
  2546.           prefs.clearUserPref("general.open_location.last_url");
  2547.         }
  2548.         catch (e) { }
  2549.  
  2550.         // Restore browser history
  2551.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2552.  
  2553.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2554.         var cookieSvc = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService);
  2555.  
  2556.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2557.         dFile.initWithPath(febePathName);
  2558.         
  2559.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2560.         fis.init(dFile, 0x01, 0444, 0);
  2561.         fis.QueryInterface(Ci.nsILineInputStream);
  2562.  
  2563.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2564.         cis.init(fis,"UTF-8", 0, 0x0000);
  2565.         
  2566.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2567.  
  2568.         // read lines into array and parse into individual fields
  2569.         var line = {}, hasmore;    
  2570.         var cnt = 0;
  2571.         do {
  2572.             hasmore = lis.readLine(line);
  2573.             var histObj = JSON.decode(line.value);
  2574.             // create an nsIURI 
  2575.             var uri = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI(histObj.aURI, null, null);
  2576.  
  2577.             try{
  2578.                 bh.addPageWithDetails(uri, histObj.aTitle, histObj.aLastVisited) 
  2579.             }catch(e){
  2580.                 var msg = "\n\naURI: "+histObj.aURI+"\naTitle: "+histObj.aTitle+"\naLastVisited: "+histObj.aLastVisited;
  2581.                 febeFatal(e, msg)
  2582.                 return false;
  2583.             }//try/catch
  2584.             cnt++;
  2585.         } while(hasmore);
  2586.         //febeWin.close();
  2587.         febeAlert(febeMsg[106]);
  2588.     }else{    
  2589.         //febeWin.close();
  2590.         febeAlert(febeMsg[46]);
  2591.     }//if
  2592.     cis.close();
  2593.     fis.close();
  2594.     return true;
  2595. }//febeRestoreBrowserHistoryOnline()
  2596.  
  2597. function febeRestoreFormFillHistory(){
  2598.     if(!febeInitDir()){return false;}
  2599.     febePathName = ""
  2600.     if(!febePickFile("ffhistory*.json",88)){return true};
  2601.     var check1 = febePrName.indexOf("ffhistory{");
  2602.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  2603.     if(check1 != 0 || check2 != 6){
  2604.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[82].replace("%FILE%","'"+febePrName+"'")+"\n";
  2605.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2606.         febeAlert(tmp);
  2607.         return false;
  2608.     }//if
  2609.  
  2610.     febeBUdate = febeGetBuDate(febePathName);
  2611.     if(febeConfirmRestore(74,febeBUdate)){
  2612.         // Get database file in profile folder
  2613.         var dbFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  2614.         dbFile.append("formhistory.sqlite"); 
  2615.  
  2616.         var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  2617.         var db = storageService.openDatabase(dbFile);
  2618.  
  2619.         var stmt;
  2620.         db.beginTransactionAs(db.TRANSACTION_DEFERRED);
  2621.         // Delete the existing table
  2622.         stmt = db.createStatement("DELETE FROM `moz_formhistory`");
  2623.         stmt.execute();
  2624.  
  2625.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2626.         var inFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2627.         inFile.initWithPath(febePathName);
  2628.         
  2629.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2630.         fis.init(inFile, 0x01, 0444, 0);
  2631.         fis.QueryInterface(Ci.nsILineInputStream);
  2632.  
  2633.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2634.         cis.init(fis,"UTF-8", 0, 0x0000);
  2635.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2636.     
  2637.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2638.  
  2639.         // Read the backup file
  2640.         var line = {}, hasmore;    
  2641.         var cnt = 0;
  2642.         try{
  2643.         do {
  2644.             hasmore = lis.readLine(line);
  2645.             obj = JSON.decode(line.value);
  2646.             var sQuery = "INSERT INTO moz_formhistory VALUES ('"+febeEscape(obj.id)+"','"+febeEscape(obj.fieldname)+"','"+febeEscape(obj.value)+"')"
  2647.             stmt = db.createStatement(sQuery);
  2648.             stmt.execute();
  2649.             cnt++;
  2650.         } while(hasmore);
  2651.         db.commitTransaction();
  2652.         febeAlert(febeMsg[89]);
  2653.         }catch(e){
  2654.             febeFatal(e,febeMsg[306]);
  2655.             return false;
  2656.         }//try/catch
  2657.     }else{
  2658.         febeAlert(febeMsg[46]);
  2659.     }
  2660.     return true;
  2661. }//febeRestoreFormFillHistory()
  2662.  
  2663. function febeRestoreFormFillHistoryOnline(){
  2664.     var date = Application.storage.get("created", "");
  2665.     febePathName = Application.storage.get("location", "");
  2666.     febeBUdate = new Date(parseInt(date));
  2667.     if(febeConfirmRestore(74,febeBUdate)){
  2668.         febeSetStatusbarMsg();
  2669.         // Get database file in profile folder
  2670.         var dbFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  2671.         dbFile.append("formhistory.sqlite"); 
  2672.  
  2673.         var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  2674.         var db = storageService.openDatabase(dbFile);
  2675.  
  2676.         var stmt;
  2677.         db.beginTransactionAs(db.TRANSACTION_DEFERRED);
  2678.         // Delete the existing table
  2679.         stmt = db.createStatement("DELETE FROM `moz_formhistory`");
  2680.         stmt.execute();
  2681.  
  2682.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2683.         var inFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2684.         inFile.initWithPath(febePathName);
  2685.         
  2686.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2687.         fis.init(inFile, 0x01, 0444, 0);
  2688.         fis.QueryInterface(Ci.nsILineInputStream);
  2689.  
  2690.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2691.         cis.init(fis,"UTF-8", 0, 0x0000);
  2692.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2693.     
  2694.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2695.  
  2696.         // Read the backup file
  2697.         var line = {}, hasmore;    
  2698.         var cnt = 0;
  2699.         do {
  2700.             hasmore = lis.readLine(line);
  2701.             obj = JSON.decode(line.value);
  2702.             var sQuery = "INSERT INTO moz_formhistory VALUES ('"+febeEscape(obj.id)+"','"+febeEscape(obj.fieldname)+"','"+febeEscape(obj.value)+"')"
  2703.             stmt = db.createStatement(sQuery);
  2704.             stmt.execute();
  2705.             cnt++;
  2706.         } while(hasmore);
  2707.         db.commitTransaction();
  2708.  
  2709.         febeAlert(febeMsg[89]);
  2710.     }else{
  2711.         febeAlert(febeMsg[46]);
  2712.     }
  2713.     return true;
  2714. }//febeRestoreFormFillHistoryOnline()
  2715.  
  2716. function febeRestorePermissions(){
  2717.     if(!febeInitDir()){return false;}
  2718.     febePathName = ""
  2719.     if(!febePickFile("permissions*.json",117)){return true};
  2720.     var check1 = febePrName.indexOf("permissions{");
  2721.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  2722.     if(check1 != 0 || check2 != 6){
  2723.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[96].replace("%FILE%","'"+febePrName+"'")+"\n";
  2724.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2725.         febeAlert(tmp);
  2726.         return false;
  2727.     }//if
  2728.  
  2729.     febeBUdate = febeGetBuDate(febePathName);
  2730.     if(febeConfirmRestore(118,febeBUdate)){
  2731.         // Get database file in profile folder
  2732.         var dbFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  2733.         dbFile.append("permissions.sqlite"); 
  2734.  
  2735.         var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  2736.         var db = storageService.openDatabase(dbFile);
  2737.  
  2738.         var stmt;
  2739.         // Delete the existing table
  2740.         stmt = db.createStatement("DROP TABLE `moz_hosts`");
  2741.         stmt.execute();
  2742.         // Create a new table
  2743.         stmt = db.createStatement("CREATE TABLE moz_hosts ( id INTEGER PRIMARY KEY,host TEXT,type TEXT,permission INTEGER)");
  2744.         stmt.execute();
  2745.         // Clean it up
  2746.         stmt = db.createStatement("VACUUM");
  2747.         stmt.execute(); 
  2748.  
  2749.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2750.         var inFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2751.         inFile.initWithPath(febePathName);
  2752.         
  2753.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2754.         fis.init(inFile, 0x01, 0444, 0);
  2755.         fis.QueryInterface(Ci.nsILineInputStream);
  2756.  
  2757.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2758.         cis.init(fis,"UTF-8", 0, 0x0000);
  2759.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2760.     
  2761.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2762.  
  2763.         // Read the backup file
  2764.         var line = {}, hasmore;    
  2765.         var cnt = 0;
  2766.         db.beginTransactionAs(db.TRANSACTION_DEFERRED);
  2767.         do {
  2768.             hasmore = lis.readLine(line);
  2769.             obj = JSON.decode(line.value)
  2770.             stmt = db.createStatement("INSERT INTO moz_hosts VALUES ('"+obj.id+"','"+obj.host+"','"+obj.type+"','"+obj.permission+"')");
  2771.             stmt.execute();
  2772.             cnt++;
  2773.         } while(hasmore);
  2774.         db.commitTransaction();
  2775.  
  2776.         febeAlert(febeMsg[119]);
  2777.     }else{
  2778.         febeAlert(febeMsg[46]);
  2779.     }
  2780.     return true;
  2781. }//febeRestorePermissions()
  2782.  
  2783. function febeRestorePermissionsOnline(){
  2784.     var date = Application.storage.get("created", "");
  2785.     febePathName = Application.storage.get("location", "");
  2786.     febeBUdate = new Date(parseInt(date));
  2787.     if(febeConfirmRestore(118,febeBUdate)){
  2788.         febeSetStatusbarMsg();
  2789.         // Get database file in profile folder
  2790.         var dbFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  2791.         dbFile.append("permissions.sqlite"); 
  2792.  
  2793.         var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  2794.         var db = storageService.openDatabase(dbFile);
  2795.  
  2796.         var stmt;
  2797.         // Delete the existing table
  2798.         stmt = db.createStatement("DROP TABLE `moz_hosts`");
  2799.         stmt.execute();
  2800.         // Create a new table
  2801.         stmt = db.createStatement("CREATE TABLE moz_hosts ( id INTEGER PRIMARY KEY,host TEXT,type TEXT,permission INTEGER)");
  2802.         stmt.execute();
  2803.         // Clean it up
  2804.         stmt = db.createStatement("VACUUM");
  2805.         stmt.execute(); 
  2806.  
  2807.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2808.         var inFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2809.         inFile.initWithPath(febePathName);
  2810.         
  2811.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2812.         fis.init(inFile, 0x01, 0444, 0);
  2813.         fis.QueryInterface(Ci.nsILineInputStream);
  2814.  
  2815.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2816.         cis.init(fis,"UTF-8", 0, 0x0000);
  2817.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2818.     
  2819.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2820.  
  2821.         // Read the backup file
  2822.         var line = {}, hasmore;    
  2823.         var cnt = 0;
  2824.         db.beginTransactionAs(db.TRANSACTION_DEFERRED);
  2825.         do {
  2826.             hasmore = lis.readLine(line);
  2827.             obj = JSON.decode(line.value)
  2828.             stmt = db.createStatement("INSERT INTO moz_hosts VALUES ('"+obj.id+"','"+obj.host+"','"+obj.type+"','"+obj.permission+"')");
  2829.             stmt.execute();
  2830.             cnt++;
  2831.         } while(hasmore);
  2832.         db.commitTransaction();
  2833.  
  2834.         febeAlert(febeMsg[119]);
  2835.     }else{
  2836.         febeAlert(febeMsg[46]);
  2837.     }
  2838.     return true;
  2839. }//febeRestorePermissionsOnline()
  2840.  
  2841. function febeRestoreUDBU(index){
  2842.     var udbuLabel = febeUDBuList[index].Label;
  2843.     var udbuDescription = febeUDBuList[index].Description;
  2844.     var udbuType = parseInt(febeUDBuList[index].Type);
  2845.     var udbuPath = febeUDBuList[index].Path; 
  2846.     febePathName = ""
  2847.     if(!febeInitDir()){return false;}
  2848.     var fMask = udbuLabel.replace(/ /g,"?")+"*";
  2849.     if(udbuType == 1){fMask = udbuLabel.replace(/ /g,"?")+"*.fbu";}
  2850.     if(!febePickFile(fMask,161)){return false;};
  2851.     febeBUdate = febeGetBuDate(febePathName);
  2852.     febeSetMsgs();
  2853.     febeMsg[163] = febeMsg[163].replace(/%fname%/,udbuDescription);
  2854.     febeMsg[164] = febeMsg[164].replace(/%fname%/,udbuDescription);
  2855.     if(udbuType == 0){
  2856.       // File restore is a straight copy
  2857.         if(febeConfirmRestore(163,febeBUdate)){
  2858.             febeCopyFile(febePathName,febeParent(udbuPath),febeLeafname(udbuPath));
  2859.             febeAlert(febeMsg[164]);
  2860.         }else{
  2861.             febeAlert(febeMsg[46]);
  2862.         }//if
  2863.     }else{
  2864.       // Restore backed up folder
  2865.         if(febeConfirmRestore(163,febeBUdate)){
  2866.             var zipFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2867.             zipFile.initWithPath(udbuPath);
  2868.         
  2869.             var sourceDir = febePfParent;
  2870.             febeGetPrefs();
  2871.             var destDir = "";
  2872.             if(febePlatform == 1){destDir = udbuPath.substr(0,3)};    // e.g., "C:\\"
  2873.             if(febePlatform == 2){destDir = "/";}
  2874.             if(febePlatform == 3){destDir = "/";}
  2875.  
  2876.             var zipName = febePrName;
  2877.             var OK = Boolean(true);
  2878.             OK = febeUnzip(sourceDir,destDir,zipName);
  2879.             //febeWin.close();
  2880.             if(OK){
  2881.                 febeChmod(destDir);
  2882.                 febeAlert(febeMsg[164].replace("%fname%",udbuLabel));
  2883.             }else{
  2884.                 febeAlert(febeMsg[46]);
  2885.             }//if
  2886.         }//if
  2887.     }//if
  2888.     return true;
  2889. }//febeRestoreUDBU()
  2890.  
  2891. function febeRestoreUDBUOnline(){
  2892.     febeSetStatusbarMsg();
  2893.     febeUDBuInit();
  2894.     var date = Application.storage.get("created", "");
  2895.     var name = Application.storage.get("boxname", "");
  2896.     febePathName = Application.storage.get("location", "");
  2897.     var zipName = Application.storage.get("name", "");
  2898.     var sourceDir = Application.storage.get("parent", "");
  2899.     febeBUdate = new Date(parseInt(date));
  2900.     var pName = "{"+febeProfName+"}";
  2901.     var p = name.indexOf(pName);
  2902.     var index = name.substr(0,p);
  2903.     var udbuLabel = febeUDBuList[index].Label;
  2904.     var udbuDescription = febeUDBuList[index].Description;
  2905.     var udbuType = parseInt(febeUDBuList[index].Type);
  2906.     var udbuPath = febeUDBuList[index].Path; 
  2907.     febeSetMsgs();
  2908.     febeMsg[163] = febeMsg[163].replace(/%fname%/,udbuDescription);
  2909.     febeMsg[164] = febeMsg[164].replace(/%fname%/,udbuDescription);
  2910.     if(udbuType == 0){
  2911.       // File restore is a straight copy
  2912.         if(febeConfirmRestore(163,febeBUdate)){
  2913.             febeCopyFile(febePathName,febeParent(udbuPath),febeLeafname(udbuPath));
  2914.             febeAlert(febeMsg[164]);
  2915.         }else{
  2916.             febeAlert(febeMsg[46]);
  2917.         }//if
  2918.     }else{
  2919.       // Restore backed up folder
  2920.         if(febeConfirmRestore(163,febeBUdate)){
  2921.             var zipFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2922.             zipFile.initWithPath(udbuPath);        
  2923.             febeGetPrefs();
  2924.             var destDir = "";
  2925.             if(febePlatform == 1){destDir = udbuPath.substr(0,3)};    // e.g., "C:\\"
  2926.             if(febePlatform == 2){destDir = "/";}
  2927.             if(febePlatform == 3){destDir = "/";}
  2928.             var OK = Boolean(true);
  2929.             OK = febeUnzip(sourceDir,destDir,zipName);
  2930.             if(OK){
  2931.                 febeChmod(destDir);
  2932.                 febeAlert(febeMsg[164].replace("%fname%",udbuLabel));
  2933.             }else{
  2934.                 febeAlert(febeMsg[46]);
  2935.             }//if
  2936.         }//if
  2937.     }//if
  2938.     return true;
  2939. }//febeRestoreUDBUOnline()
  2940.  
  2941. function febeDirCopy2(sourceDir,batchFileName){
  2942. // Recursively copy individual files and sub-directories to a destination directory
  2943. // Very tricky code ... could be written better.  So little time, so much to do
  2944.     var tmp = "sourceDir: "+sourceDir;
  2945.     tmp += "\nfebeSubRootDir: "+febeSubRootDir;
  2946.     tmp += "\nfebeDestDir: "+febeDestDir.path;
  2947.  
  2948.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2949.     if (!aFile) return false;
  2950.  
  2951.     aFile.initWithPath(sourceDir);
  2952.     var entries = aFile.directoryEntries;
  2953.     
  2954.     while(entries.hasMoreElements()){
  2955.         var entry = entries.getNext();
  2956.         entry.QueryInterface(Ci.nsIFile);
  2957.         var src = entry.path;
  2958.         var p = src.indexOf(febeSubRootDir)
  2959.         if(p == -1){continue;}
  2960.         if(entry.isDirectory()){
  2961.             febeDirCopy2(src,batchFileName);
  2962.         }else{
  2963.             var parentPath = entry.parent.path;
  2964.             var dest = febeDestDir.path+"\\"+parentPath.substring(p);
  2965.             var re = "\\"+batchFileName+"";
  2966.             ;
  2967.             var file = entry.leafName;
  2968.             febeCopyFile(src,dest.replace(re,"\\"),file);
  2969.         }//if
  2970.     }//while
  2971.     return true;
  2972. }//febeDirCopy2()
  2973.  
  2974. // ------------------ End of Restore Functions ------------
  2975.  
  2976. //alert("febe.js loaded");